using System;
using System.Collections.Generic;
using Unity.UIWidgets.foundation;
using UnityEngine;

namespace Unity.UIWidgets.services {
    public abstract class KeyboardKey : Diagnosticable {
        protected KeyboardKey() {
        }
    }

    public class LogicalKeyboardKey : KeyboardKey, IEquatable<LogicalKeyboardKey> {
        public bool Equals(LogicalKeyboardKey other) {
            if (ReferenceEquals(null, other)) {
                return false;
            }

            if (ReferenceEquals(this, other)) {
                return true;
            }

            return keyId == other.keyId;
        }

        public override bool Equals(object obj) {
            if (ReferenceEquals(null, obj)) {
                return false;
            }

            if (ReferenceEquals(this, obj)) {
                return true;
            }

            if (obj.GetType() != GetType()) {
                return false;
            }

            return Equals((LogicalKeyboardKey) obj);
        }

        public override int GetHashCode() {
            unchecked {
                int hashCode = (int) keyId;
                return hashCode;
            }
        }

        public LogicalKeyboardKey(long keyId, string debugName = null, string keyLabel = null) : base() {
            D.assert(keyId != null);
            this.keyId = keyId;
            this.debugName = debugName;
            this.keyLabel = keyLabel;
        }

        public readonly long keyId;

        public readonly string debugName;

        public readonly string keyLabel;

        public static LogicalKeyboardKey findKeyByKeyId(int keyId) {
            return _knownLogicalKeys[keyId];
        }

        public static bool isControlCharacter(string label) {
            if (label.Length > 1) {
                return false;
            }

            int codeUnit = label[0];
            return (codeUnit <= 0x1f && codeUnit >= 0x00) || (codeUnit >= 0x7f && codeUnit <= 0x9f);
        }

        public bool isAutogenerated {
            get { return (keyId & autogeneratedMask) != 0; }
        }

        public HashSet<LogicalKeyboardKey> synonyms {
            get {
                HashSet<LogicalKeyboardKey> result = new HashSet<LogicalKeyboardKey>();
                LogicalKeyboardKey item = _synonyms.getOrDefault(this);
                if (item == null) {
                    return result;
                }

                result.Add(item: item);
                return result;
            }
        }

        public static HashSet<LogicalKeyboardKey> collapseSynonyms(HashSet<LogicalKeyboardKey> input) {
            HashSet<LogicalKeyboardKey> result = new HashSet<LogicalKeyboardKey>();
            foreach (LogicalKeyboardKey key in input) {
                LogicalKeyboardKey synonym = _synonyms.getOrDefault(key);
                result.Add(synonym ?? key);
            }

            return result;
        }


        public override void debugFillProperties(DiagnosticPropertiesBuilder properties) {
            base.debugFillProperties(properties);
            properties.add(new StringProperty("keyId", keyId.ToString().PadLeft(8, (char)0), showName: true));
            properties.add(new StringProperty("keyLabel", keyLabel, showName: true));
            properties.add(new StringProperty("debugName", debugName, showName: true, defaultValue: null));
        }

        public static readonly long valueMask = 0x000FFFFFFFF;

        public static readonly long platformMask = 0x0FF00000000;

        public static readonly long autogeneratedMask = 0x10000000000;

        public static readonly long synonymMask = 0x20000000000;

        public static readonly long unicodePlane = 0x00000000000;

        public static readonly long hidPlane = 0x00100000000;


        public static readonly LogicalKeyboardKey none =
            new LogicalKeyboardKey(0x00100000000, debugName: foundation_.kReleaseMode ? null : "None");

        public static readonly LogicalKeyboardKey hyper =
            new LogicalKeyboardKey(0x00100000010, debugName: foundation_.kReleaseMode ? null : "Hype");


        public static readonly LogicalKeyboardKey superKey =
            new LogicalKeyboardKey(0x00100000011, debugName: foundation_.kReleaseMode ? null : "Super Key");


        public static readonly LogicalKeyboardKey fnLock =
            new LogicalKeyboardKey(0x00100000013, debugName: foundation_.kReleaseMode ? null : "Fn Lock");


        public static readonly LogicalKeyboardKey suspend =
            new LogicalKeyboardKey(0x00100000014, debugName: foundation_.kReleaseMode ? null : "Suspend");


        public static readonly LogicalKeyboardKey resume =
            new LogicalKeyboardKey(0x00100000015, debugName: foundation_.kReleaseMode ? null : "Resume");


        public static readonly LogicalKeyboardKey turbo =
            new LogicalKeyboardKey(0x00100000016, debugName: foundation_.kReleaseMode ? null : "Turbo");


        public static readonly LogicalKeyboardKey privacyScreenToggle = new LogicalKeyboardKey(0x00100000017,
            debugName: foundation_.kReleaseMode ? null : "Privacy Screen Toggle");


        public static readonly LogicalKeyboardKey sleep =
            new LogicalKeyboardKey(0x00100010082, debugName: foundation_.kReleaseMode ? null : "Sleep");


        public static readonly LogicalKeyboardKey wakeUp =
            new LogicalKeyboardKey(0x00100010083, debugName: foundation_.kReleaseMode ? null : "Wake Up");


        public static readonly LogicalKeyboardKey displayToggleIntExt = new LogicalKeyboardKey(0x001000100b5,
            debugName: foundation_.kReleaseMode ? null : "Display Toggle Int Ext");


        public static readonly LogicalKeyboardKey usbReserved = new LogicalKeyboardKey(0x00100070000,
            debugName: foundation_.kReleaseMode ? null : "Usb Reserved");


        public static readonly LogicalKeyboardKey usbErrorRollOver = new LogicalKeyboardKey(0x00100070001,
            debugName: foundation_.kReleaseMode ? null : "Usb Error Roll Ove");


        public static readonly LogicalKeyboardKey usbPostFail = new LogicalKeyboardKey(0x00100070002,
            debugName: foundation_.kReleaseMode ? null : "Usb Post Fail");


        public static readonly LogicalKeyboardKey usbErrorUndefined = new LogicalKeyboardKey(0x00100070003,
            debugName: foundation_.kReleaseMode ? null : "Usb Error Undefined");


        public static readonly LogicalKeyboardKey keyA = new LogicalKeyboardKey((long)KeyCode.A, keyLabel: "a",
            debugName: foundation_.kReleaseMode ? null : "Key A");


        public static readonly LogicalKeyboardKey keyB = new LogicalKeyboardKey((long)KeyCode.B, keyLabel: "b",
            debugName: foundation_.kReleaseMode ? null : "Key B");


        public static readonly LogicalKeyboardKey keyC = new LogicalKeyboardKey((long)KeyCode.C, keyLabel: "c",
            debugName: foundation_.kReleaseMode ? null : "Key C");


        public static readonly LogicalKeyboardKey keyD = new LogicalKeyboardKey((long)KeyCode.D, keyLabel: "d",
            debugName: foundation_.kReleaseMode ? null : "Key D");


        public static readonly LogicalKeyboardKey keyE = new LogicalKeyboardKey((long)KeyCode.E, keyLabel: "e",
            debugName: foundation_.kReleaseMode ? null : "Key E");


        public static readonly LogicalKeyboardKey keyF = new LogicalKeyboardKey((long)KeyCode.F, keyLabel: "f",
            debugName: foundation_.kReleaseMode ? null : "Key F");


        public static readonly LogicalKeyboardKey keyG = new LogicalKeyboardKey((long)KeyCode.G, keyLabel: "g",
            debugName: foundation_.kReleaseMode ? null : "Key G");


        public static readonly LogicalKeyboardKey keyH = new LogicalKeyboardKey((long)KeyCode.H, keyLabel: "h",
            debugName: foundation_.kReleaseMode ? null : "Key H");


        public static readonly LogicalKeyboardKey keyI = new LogicalKeyboardKey((long)KeyCode.I, keyLabel: "i",
            debugName: foundation_.kReleaseMode ? null : "Key I");


        public static readonly LogicalKeyboardKey keyJ = new LogicalKeyboardKey((long)KeyCode.J, keyLabel: "j",
            debugName: foundation_.kReleaseMode ? null : "Key J");


        public static readonly LogicalKeyboardKey keyK = new LogicalKeyboardKey((long)KeyCode.K, keyLabel: "k",
            debugName: foundation_.kReleaseMode ? null : "Key K");


        public static readonly LogicalKeyboardKey keyL = new LogicalKeyboardKey((long)KeyCode.L, keyLabel: "l",
            debugName: foundation_.kReleaseMode ? null : "Key L");


        public static readonly LogicalKeyboardKey keyM = new LogicalKeyboardKey((long)KeyCode.M, keyLabel: "m",
            debugName: foundation_.kReleaseMode ? null : "Key M");


        public static readonly LogicalKeyboardKey keyN = new LogicalKeyboardKey((long)KeyCode.N, keyLabel: "n",
            debugName: foundation_.kReleaseMode ? null : "Key N");


        public static readonly LogicalKeyboardKey keyO = new LogicalKeyboardKey((long)KeyCode.O, keyLabel: "o",
            debugName: foundation_.kReleaseMode ? null : "Key O");


        public static readonly LogicalKeyboardKey keyP = new LogicalKeyboardKey((long)KeyCode.P, keyLabel: "p",
            debugName: foundation_.kReleaseMode ? null : "Key P");


        public static readonly LogicalKeyboardKey keyQ = new LogicalKeyboardKey((long)KeyCode.Q, keyLabel: "q",
            debugName: foundation_.kReleaseMode ? null : "Key Q");


        public static readonly LogicalKeyboardKey keyR = new LogicalKeyboardKey((long)KeyCode.R, keyLabel: "",
            debugName: foundation_.kReleaseMode ? null : "Key ");


        public static readonly LogicalKeyboardKey keyS = new LogicalKeyboardKey((long)KeyCode.S, keyLabel: "s",
            debugName: foundation_.kReleaseMode ? null : "Key S");


        public static readonly LogicalKeyboardKey keyT = new LogicalKeyboardKey((long)KeyCode.T, keyLabel: "t",
            debugName: foundation_.kReleaseMode ? null : "Key T");


        public static readonly LogicalKeyboardKey keyU = new LogicalKeyboardKey((long)KeyCode.U, keyLabel: "u",
            debugName: foundation_.kReleaseMode ? null : "Key U");


        public static readonly LogicalKeyboardKey keyV = new LogicalKeyboardKey((long)KeyCode.V, keyLabel: "v",
            debugName: foundation_.kReleaseMode ? null : "Key V");


        public static readonly LogicalKeyboardKey keyW = new LogicalKeyboardKey((long)KeyCode.W, keyLabel: "w",
            debugName: foundation_.kReleaseMode ? null : "Key W");


        public static readonly LogicalKeyboardKey keyX = new LogicalKeyboardKey((long)KeyCode.X, keyLabel: "x",
            debugName: foundation_.kReleaseMode ? null : "Key X");


        public static readonly LogicalKeyboardKey keyY = new LogicalKeyboardKey((long)KeyCode.Y, keyLabel: "y",
            debugName: foundation_.kReleaseMode ? null : "Key Y");


        public static readonly LogicalKeyboardKey keyZ = new LogicalKeyboardKey((long)KeyCode.Z, keyLabel: "z",
            debugName: foundation_.kReleaseMode ? null : "Key Z");


        public static readonly LogicalKeyboardKey digit1 = new LogicalKeyboardKey(0x00000000031, keyLabel: "1",
            debugName: foundation_.kReleaseMode ? null : "Digit 1");


        public static readonly LogicalKeyboardKey digit2 = new LogicalKeyboardKey(0x00000000032, keyLabel: "2",
            debugName: foundation_.kReleaseMode ? null : "Digit 2");


        public static readonly LogicalKeyboardKey digit3 = new LogicalKeyboardKey(0x00000000033, keyLabel: "3",
            debugName: foundation_.kReleaseMode ? null : "Digit 3");


        public static readonly LogicalKeyboardKey digit4 = new LogicalKeyboardKey(0x00000000034, keyLabel: "4",
            debugName: foundation_.kReleaseMode ? null : "Digit 4");


        public static readonly LogicalKeyboardKey digit5 = new LogicalKeyboardKey(0x00000000035, keyLabel: "5",
            debugName: foundation_.kReleaseMode ? null : "Digit 5");


        public static readonly LogicalKeyboardKey digit6 = new LogicalKeyboardKey(0x00000000036, keyLabel: "6",
            debugName: foundation_.kReleaseMode ? null : "Digit 6");


        public static readonly LogicalKeyboardKey digit7 = new LogicalKeyboardKey(0x00000000037, keyLabel: "7",
            debugName: foundation_.kReleaseMode ? null : "Digit 7");


        public static readonly LogicalKeyboardKey digit8 = new LogicalKeyboardKey(0x00000000038, keyLabel: "8",
            debugName: foundation_.kReleaseMode ? null : "Digit 8");


        public static readonly LogicalKeyboardKey digit9 = new LogicalKeyboardKey(0x00000000039, keyLabel: "9",
            debugName: foundation_.kReleaseMode ? null : "Digit 9");


        public static readonly LogicalKeyboardKey digit0 = new LogicalKeyboardKey(0x00000000030, keyLabel: "0",
            debugName: foundation_.kReleaseMode ? null : "Digit 0");


        public static readonly LogicalKeyboardKey enter =
            new LogicalKeyboardKey((long)KeyCode.Return, debugName: foundation_.kReleaseMode ? null : "Ente");


        public static readonly LogicalKeyboardKey escape =
            new LogicalKeyboardKey((long)KeyCode.Escape, debugName: foundation_.kReleaseMode ? null : "Escape");


        public static readonly LogicalKeyboardKey backspace =
            new LogicalKeyboardKey((long)KeyCode.Backspace, debugName: foundation_.kReleaseMode ? null : "Backspace");


        public static readonly LogicalKeyboardKey tab =
            new LogicalKeyboardKey((long)KeyCode.Tab, debugName: foundation_.kReleaseMode ? null : "Tab");


        public static readonly LogicalKeyboardKey space = new LogicalKeyboardKey((long)KeyCode.Space, keyLabel: " ",
            debugName: foundation_.kReleaseMode ? null : "Space");


        public static readonly LogicalKeyboardKey minus = new LogicalKeyboardKey(0x0000000002d, keyLabel: "-",
            debugName: foundation_.kReleaseMode ? null : "Minus");


        public static readonly LogicalKeyboardKey equal = new LogicalKeyboardKey(0x0000000003d, keyLabel: "=",
            debugName: foundation_.kReleaseMode ? null : "Equal");


        public static readonly LogicalKeyboardKey bracketLeft = new LogicalKeyboardKey(0x0000000005b, keyLabel: "[",
            debugName: foundation_.kReleaseMode ? null : "Bracket Left");


        public static readonly LogicalKeyboardKey bracketRight = new LogicalKeyboardKey(0x0000000005d, keyLabel: "]",
            debugName: foundation_.kReleaseMode ? null : "Bracket Right");


        public static readonly LogicalKeyboardKey backslash = new LogicalKeyboardKey(0x0000000005c, keyLabel: "\\",
            debugName: foundation_.kReleaseMode ? null : "Backslash");


        public static readonly LogicalKeyboardKey semicolon = new LogicalKeyboardKey(0x0000000003b, keyLabel: ";",
            debugName: foundation_.kReleaseMode ? null : "Semicolon");


        public static readonly LogicalKeyboardKey quote = new LogicalKeyboardKey(0x00000000027, keyLabel: "\"",
            debugName: foundation_.kReleaseMode ? null : "Quote");


        public static readonly LogicalKeyboardKey backquote = new LogicalKeyboardKey(0x00000000060, keyLabel: "`",
            debugName: foundation_.kReleaseMode ? null : "Backquote");


        public static readonly LogicalKeyboardKey comma = new LogicalKeyboardKey(0x0000000002c, keyLabel: ",",
            debugName: foundation_.kReleaseMode ? null : "Comma");


        public static readonly LogicalKeyboardKey period = new LogicalKeyboardKey(0x0000000002e, keyLabel: ".",
            debugName: foundation_.kReleaseMode ? null : "Period");


        public static readonly LogicalKeyboardKey slash = new LogicalKeyboardKey(0x0000000002f, keyLabel: "/",
            debugName: foundation_.kReleaseMode ? null : "Slash");


        public static readonly LogicalKeyboardKey capsLock =
            new LogicalKeyboardKey(0x00100070039, debugName: foundation_.kReleaseMode ? null : "Caps Lock");


        public static readonly LogicalKeyboardKey f1 =
            new LogicalKeyboardKey(0x0010007003a, debugName: foundation_.kReleaseMode ? null : "F1");


        public static readonly LogicalKeyboardKey f2 =
            new LogicalKeyboardKey(0x0010007003b, debugName: foundation_.kReleaseMode ? null : "F2");


        public static readonly LogicalKeyboardKey f3 =
            new LogicalKeyboardKey(0x0010007003c, debugName: foundation_.kReleaseMode ? null : "F3");


        public static readonly LogicalKeyboardKey f4 =
            new LogicalKeyboardKey(0x0010007003d, debugName: foundation_.kReleaseMode ? null : "F4");


        public static readonly LogicalKeyboardKey f5 =
            new LogicalKeyboardKey(0x0010007003e, debugName: foundation_.kReleaseMode ? null : "F5");


        public static readonly LogicalKeyboardKey f6 =
            new LogicalKeyboardKey(0x0010007003f, debugName: foundation_.kReleaseMode ? null : "F6");


        public static readonly LogicalKeyboardKey f7 =
            new LogicalKeyboardKey(0x00100070040, debugName: foundation_.kReleaseMode ? null : "F7");


        public static readonly LogicalKeyboardKey f8 =
            new LogicalKeyboardKey(0x00100070041, debugName: foundation_.kReleaseMode ? null : "F8");


        public static readonly LogicalKeyboardKey f9 =
            new LogicalKeyboardKey(0x00100070042, debugName: foundation_.kReleaseMode ? null : "F9");


        public static readonly LogicalKeyboardKey f10 =
            new LogicalKeyboardKey(0x00100070043, debugName: foundation_.kReleaseMode ? null : "F10");


        public static readonly LogicalKeyboardKey f11 =
            new LogicalKeyboardKey(0x00100070044, debugName: foundation_.kReleaseMode ? null : "F11");


        public static readonly LogicalKeyboardKey f12 =
            new LogicalKeyboardKey(0x00100070045, debugName: foundation_.kReleaseMode ? null : "F12");


        public static readonly LogicalKeyboardKey printScreen = new LogicalKeyboardKey(0x00100070046,
            debugName: foundation_.kReleaseMode ? null : "Print Screen");


        public static readonly LogicalKeyboardKey scrollLock =
            new LogicalKeyboardKey(0x00100070047, debugName: foundation_.kReleaseMode ? null : "Scroll Lock");


        public static readonly LogicalKeyboardKey pause =
            new LogicalKeyboardKey(0x00100070048, debugName: foundation_.kReleaseMode ? null : "Pause");


        public static readonly LogicalKeyboardKey insert =
            new LogicalKeyboardKey(0x00100070049, debugName: foundation_.kReleaseMode ? null : "Insert");


        public static readonly LogicalKeyboardKey home =
            new LogicalKeyboardKey(0x0010007004a, debugName: foundation_.kReleaseMode ? null : "Home");


        public static readonly LogicalKeyboardKey pageUp =
            new LogicalKeyboardKey(0x0010007004b, debugName: foundation_.kReleaseMode ? null : "Page Up");


        public static readonly LogicalKeyboardKey delete =
            new LogicalKeyboardKey(0x0010007004c, debugName: foundation_.kReleaseMode ? null : "Delete");


        public static readonly LogicalKeyboardKey end =
            new LogicalKeyboardKey(0x0010007004d, debugName: foundation_.kReleaseMode ? null : "End");


        public static readonly LogicalKeyboardKey pageDown =
            new LogicalKeyboardKey(0x0010007004e, debugName: foundation_.kReleaseMode ? null : "Page Down");


        public static readonly LogicalKeyboardKey arrowRight =
            new LogicalKeyboardKey(0x0010007004f, debugName: foundation_.kReleaseMode ? null : "Arrow Right");


        public static readonly LogicalKeyboardKey arrowLeft =
            new LogicalKeyboardKey(0x00100070050, debugName: foundation_.kReleaseMode ? null : "Arrow Left");


        public static readonly LogicalKeyboardKey arrowDown =
            new LogicalKeyboardKey(0x00100070051, debugName: foundation_.kReleaseMode ? null : "Arrow Down");


        public static readonly LogicalKeyboardKey arrowUp =
            new LogicalKeyboardKey(0x00100070052, debugName: foundation_.kReleaseMode ? null : "Arrow Up");


        public static readonly LogicalKeyboardKey numLock =
            new LogicalKeyboardKey(0x00100070053, debugName: foundation_.kReleaseMode ? null : "Num Lock");


        public static readonly LogicalKeyboardKey numpadDivide = new LogicalKeyboardKey(0x00100070054, keyLabel: "/",
            debugName: foundation_.kReleaseMode ? null : "Numpad Divide");


        public static readonly LogicalKeyboardKey numpadMultiply = new LogicalKeyboardKey(0x00100070055, keyLabel: "*",
            debugName: foundation_.kReleaseMode ? null : "Numpad Multiply");


        public static readonly LogicalKeyboardKey numpadSubtract = new LogicalKeyboardKey(0x00100070056, keyLabel: "-",
            debugName: foundation_.kReleaseMode ? null : "Numpad Subtract");


        public static readonly LogicalKeyboardKey numpadAdd = new LogicalKeyboardKey(0x00100070057, keyLabel: "+",
            debugName: foundation_.kReleaseMode ? null : "Numpad Add");


        public static readonly LogicalKeyboardKey numpadEnter =
            new LogicalKeyboardKey(0x00100070058, debugName: foundation_.kReleaseMode ? null : "Numpad Ente");


        public static readonly LogicalKeyboardKey numpad1 = new LogicalKeyboardKey(0x00100070059, keyLabel: "1",
            debugName: foundation_.kReleaseMode ? null : "Numpad 1");


        public static readonly LogicalKeyboardKey numpad2 = new LogicalKeyboardKey(0x0010007005a, keyLabel: "2",
            debugName: foundation_.kReleaseMode ? null : "Numpad 2");


        public static readonly LogicalKeyboardKey numpad3 = new LogicalKeyboardKey(0x0010007005b, keyLabel: "3",
            debugName: foundation_.kReleaseMode ? null : "Numpad 3");


        public static readonly LogicalKeyboardKey numpad4 = new LogicalKeyboardKey(0x0010007005c, keyLabel: "4",
            debugName: foundation_.kReleaseMode ? null : "Numpad 4");


        public static readonly LogicalKeyboardKey numpad5 = new LogicalKeyboardKey(0x0010007005d, keyLabel: "5",
            debugName: foundation_.kReleaseMode ? null : "Numpad 5");


        public static readonly LogicalKeyboardKey numpad6 = new LogicalKeyboardKey(0x0010007005e, keyLabel: "6",
            debugName: foundation_.kReleaseMode ? null : "Numpad 6");


        public static readonly LogicalKeyboardKey numpad7 = new LogicalKeyboardKey(0x0010007005f, keyLabel: "7",
            debugName: foundation_.kReleaseMode ? null : "Numpad 7");


        public static readonly LogicalKeyboardKey numpad8 = new LogicalKeyboardKey(0x00100070060, keyLabel: "8",
            debugName: foundation_.kReleaseMode ? null : "Numpad 8");


        public static readonly LogicalKeyboardKey numpad9 = new LogicalKeyboardKey(0x00100070061, keyLabel: "9",
            debugName: foundation_.kReleaseMode ? null : "Numpad 9");


        public static readonly LogicalKeyboardKey numpad0 = new LogicalKeyboardKey(0x00100070062, keyLabel: "0",
            debugName: foundation_.kReleaseMode ? null : "Numpad 0");


        public static readonly LogicalKeyboardKey numpadDecimal = new LogicalKeyboardKey(0x00100070063, keyLabel: ".",
            debugName: foundation_.kReleaseMode ? null : "Numpad Decimal");


        public static readonly LogicalKeyboardKey intlBackslash = new LogicalKeyboardKey(0x00100070064,
            debugName: foundation_.kReleaseMode ? null : "Intl Backslash");


        public static readonly LogicalKeyboardKey contextMenu = new LogicalKeyboardKey(0x00100070065,
            debugName: foundation_.kReleaseMode ? null : "Context Menu");


        public static readonly LogicalKeyboardKey power =
            new LogicalKeyboardKey(0x00100070066, debugName: foundation_.kReleaseMode ? null : "Powe");


        public static readonly LogicalKeyboardKey numpadEqual = new LogicalKeyboardKey(0x00100070067, keyLabel: "=",
            debugName: foundation_.kReleaseMode ? null : "Numpad Equal");


        public static readonly LogicalKeyboardKey f13 =
            new LogicalKeyboardKey(0x00100070068, debugName: foundation_.kReleaseMode ? null : "F13");


        public static readonly LogicalKeyboardKey f14 =
            new LogicalKeyboardKey(0x00100070069, debugName: foundation_.kReleaseMode ? null : "F14");


        public static readonly LogicalKeyboardKey f15 =
            new LogicalKeyboardKey(0x0010007006a, debugName: foundation_.kReleaseMode ? null : "F15");


        public static readonly LogicalKeyboardKey f16 =
            new LogicalKeyboardKey(0x0010007006b, debugName: foundation_.kReleaseMode ? null : "F16");


        public static readonly LogicalKeyboardKey f17 =
            new LogicalKeyboardKey(0x0010007006c, debugName: foundation_.kReleaseMode ? null : "F17");


        public static readonly LogicalKeyboardKey f18 =
            new LogicalKeyboardKey(0x0010007006d, debugName: foundation_.kReleaseMode ? null : "F18");


        public static readonly LogicalKeyboardKey f19 =
            new LogicalKeyboardKey(0x0010007006e, debugName: foundation_.kReleaseMode ? null : "F19");


        public static readonly LogicalKeyboardKey f20 =
            new LogicalKeyboardKey(0x0010007006f, debugName: foundation_.kReleaseMode ? null : "F20");


        public static readonly LogicalKeyboardKey f21 =
            new LogicalKeyboardKey(0x00100070070, debugName: foundation_.kReleaseMode ? null : "F21");


        public static readonly LogicalKeyboardKey f22 =
            new LogicalKeyboardKey(0x00100070071, debugName: foundation_.kReleaseMode ? null : "F22");


        public static readonly LogicalKeyboardKey f23 =
            new LogicalKeyboardKey(0x00100070072, debugName: foundation_.kReleaseMode ? null : "F23");


        public static readonly LogicalKeyboardKey f24 =
            new LogicalKeyboardKey(0x00100070073, debugName: foundation_.kReleaseMode ? null : "F24");


        public static readonly LogicalKeyboardKey open =
            new LogicalKeyboardKey(0x00100070074, debugName: foundation_.kReleaseMode ? null : "Open");


        public static readonly LogicalKeyboardKey help =
            new LogicalKeyboardKey(0x00100070075, debugName: foundation_.kReleaseMode ? null : "Help");


        public static readonly LogicalKeyboardKey select =
            new LogicalKeyboardKey(0x00100070077, debugName: foundation_.kReleaseMode ? null : "Select");


        public static readonly LogicalKeyboardKey again =
            new LogicalKeyboardKey(0x00100070079, debugName: foundation_.kReleaseMode ? null : "Again");


        public static readonly LogicalKeyboardKey undo =
            new LogicalKeyboardKey(0x0010007007a, debugName: foundation_.kReleaseMode ? null : "Undo");


        public static readonly LogicalKeyboardKey cut =
            new LogicalKeyboardKey(0x0010007007b, debugName: foundation_.kReleaseMode ? null : "Cut");


        public static readonly LogicalKeyboardKey copy =
            new LogicalKeyboardKey(0x0010007007c, debugName: foundation_.kReleaseMode ? null : "Copy");


        public static readonly LogicalKeyboardKey paste =
            new LogicalKeyboardKey(0x0010007007d, debugName: foundation_.kReleaseMode ? null : "Paste");


        public static readonly LogicalKeyboardKey find =
            new LogicalKeyboardKey(0x0010007007e, debugName: foundation_.kReleaseMode ? null : "Find");


        public static readonly LogicalKeyboardKey audioVolumeMute = new LogicalKeyboardKey(0x0010007007f,
            debugName: foundation_.kReleaseMode ? null : "Audio Volume Mute");


        public static readonly LogicalKeyboardKey audioVolumeUp = new LogicalKeyboardKey(0x00100070080,
            debugName: foundation_.kReleaseMode ? null : "Audio Volume Up");


        public static readonly LogicalKeyboardKey audioVolumeDown = new LogicalKeyboardKey(0x00100070081,
            debugName: foundation_.kReleaseMode ? null : "Audio Volume Down");


        public static readonly LogicalKeyboardKey numpadComma = new LogicalKeyboardKey(0x00100070085, keyLabel: ",",
            debugName: foundation_.kReleaseMode ? null : "Numpad Comma");


        public static readonly LogicalKeyboardKey intlRo =
            new LogicalKeyboardKey(0x00100070087, debugName: foundation_.kReleaseMode ? null : "Intl Ro");


        public static readonly LogicalKeyboardKey kanaMode =
            new LogicalKeyboardKey(0x00100070088, debugName: foundation_.kReleaseMode ? null : "Kana Mode");


        public static readonly LogicalKeyboardKey intlYen =
            new LogicalKeyboardKey(0x00100070089, debugName: foundation_.kReleaseMode ? null : "Intl Yen");


        public static readonly LogicalKeyboardKey convert =
            new LogicalKeyboardKey(0x0010007008a, debugName: foundation_.kReleaseMode ? null : "Convert");


        public static readonly LogicalKeyboardKey nonConvert =
            new LogicalKeyboardKey(0x0010007008b, debugName: foundation_.kReleaseMode ? null : "Non Convert");


        public static readonly LogicalKeyboardKey lang1 =
            new LogicalKeyboardKey(0x00100070090, debugName: foundation_.kReleaseMode ? null : "Lang 1");


        public static readonly LogicalKeyboardKey lang2 =
            new LogicalKeyboardKey(0x00100070091, debugName: foundation_.kReleaseMode ? null : "Lang 2");


        public static readonly LogicalKeyboardKey lang3 =
            new LogicalKeyboardKey(0x00100070092, debugName: foundation_.kReleaseMode ? null : "Lang 3");


        public static readonly LogicalKeyboardKey lang4 =
            new LogicalKeyboardKey(0x00100070093, debugName: foundation_.kReleaseMode ? null : "Lang 4");


        public static readonly LogicalKeyboardKey lang5 =
            new LogicalKeyboardKey(0x00100070094, debugName: foundation_.kReleaseMode ? null : "Lang 5");


        public static readonly LogicalKeyboardKey abort =
            new LogicalKeyboardKey(0x0010007009b, debugName: foundation_.kReleaseMode ? null : "Abort");


        public static readonly LogicalKeyboardKey props =
            new LogicalKeyboardKey(0x001000700a3, debugName: foundation_.kReleaseMode ? null : "Props");


        public static readonly LogicalKeyboardKey numpadParenLeft = new LogicalKeyboardKey(0x001000700b6, keyLabel: "(",
            debugName: foundation_.kReleaseMode ? null : "Numpad Paren Left");


        public static readonly LogicalKeyboardKey numpadParenRight = new LogicalKeyboardKey(0x001000700b7,
            keyLabel: ")", debugName: foundation_.kReleaseMode ? null : "Numpad Paren Right");


        public static readonly LogicalKeyboardKey numpadBackspace = new LogicalKeyboardKey(0x001000700bb,
            debugName: foundation_.kReleaseMode ? null : "Numpad Backspace");


        public static readonly LogicalKeyboardKey numpadMemoryStore = new LogicalKeyboardKey(0x001000700d0,
            debugName: foundation_.kReleaseMode ? null : "Numpad Memory Store");


        public static readonly LogicalKeyboardKey numpadMemoryRecall = new LogicalKeyboardKey(0x001000700d1,
            debugName: foundation_.kReleaseMode ? null : "Numpad Memory Recall");


        public static readonly LogicalKeyboardKey numpadMemoryClear = new LogicalKeyboardKey(0x001000700d2,
            debugName: foundation_.kReleaseMode ? null : "Numpad Memory Clea");


        public static readonly LogicalKeyboardKey numpadMemoryAdd = new LogicalKeyboardKey(0x001000700d3,
            debugName: foundation_.kReleaseMode ? null : "Numpad Memory Add");


        public static readonly LogicalKeyboardKey numpadMemorySubtract = new LogicalKeyboardKey(0x001000700d4,
            debugName: foundation_.kReleaseMode ? null : "Numpad Memory Subtract");


        public static readonly LogicalKeyboardKey numpadSignChange = new LogicalKeyboardKey(0x001000700d7,
            debugName: foundation_.kReleaseMode ? null : "Numpad Sign Change");


        public static readonly LogicalKeyboardKey numpadClear =
            new LogicalKeyboardKey(0x001000700d8, debugName: foundation_.kReleaseMode ? null : "Numpad Clea");


        public static readonly LogicalKeyboardKey numpadClearEntry = new LogicalKeyboardKey(0x001000700d9,
            debugName: foundation_.kReleaseMode ? null : "Numpad Clear Entry");


        public static readonly LogicalKeyboardKey controlLeft = new LogicalKeyboardKey(0x001000700e0,
            debugName: foundation_.kReleaseMode ? null : "Control Left");


        public static readonly LogicalKeyboardKey shiftLeft =
            new LogicalKeyboardKey(0x001000700e1, debugName: foundation_.kReleaseMode ? null : "Shift Left");


        public static readonly LogicalKeyboardKey altLeft =
            new LogicalKeyboardKey(0x001000700e2, debugName: foundation_.kReleaseMode ? null : "Alt Left");


        public static readonly LogicalKeyboardKey metaLeft =
            new LogicalKeyboardKey(0x001000700e3, debugName: foundation_.kReleaseMode ? null : "Meta Left");


        public static readonly LogicalKeyboardKey controlRight = new LogicalKeyboardKey(0x001000700e4,
            debugName: foundation_.kReleaseMode ? null : "Control Right");


        public static readonly LogicalKeyboardKey shiftRight =
            new LogicalKeyboardKey(0x001000700e5, debugName: foundation_.kReleaseMode ? null : "Shift Right");


        public static readonly LogicalKeyboardKey altRight =
            new LogicalKeyboardKey(0x001000700e6, debugName: foundation_.kReleaseMode ? null : "Alt Right");


        public static readonly LogicalKeyboardKey metaRight =
            new LogicalKeyboardKey(0x001000700e7, debugName: foundation_.kReleaseMode ? null : "Meta Right");


        public static readonly LogicalKeyboardKey info =
            new LogicalKeyboardKey(0x001000c0060, debugName: foundation_.kReleaseMode ? null : "Info");


        public static readonly LogicalKeyboardKey closedCaptionToggle = new LogicalKeyboardKey(0x001000c0061,
            debugName: foundation_.kReleaseMode ? null : "Closed Caption Toggle");


        public static readonly LogicalKeyboardKey brightnessUp = new LogicalKeyboardKey(0x001000c006f,
            debugName: foundation_.kReleaseMode ? null : "Brightness Up");


        public static readonly LogicalKeyboardKey brightnessDown = new LogicalKeyboardKey(0x001000c0070,
            debugName: foundation_.kReleaseMode ? null : "Brightness Down");


        public static readonly LogicalKeyboardKey brightnessToggle = new LogicalKeyboardKey(0x001000c0072,
            debugName: foundation_.kReleaseMode ? null : "Brightness Toggle");


        public static readonly LogicalKeyboardKey brightnessMinimum = new LogicalKeyboardKey(0x001000c0073,
            debugName: foundation_.kReleaseMode ? null : "Brightness Minimum");


        public static readonly LogicalKeyboardKey brightnessMaximum = new LogicalKeyboardKey(0x001000c0074,
            debugName: foundation_.kReleaseMode ? null : "Brightness Maximum");


        public static readonly LogicalKeyboardKey brightnessAuto = new LogicalKeyboardKey(0x001000c0075,
            debugName: foundation_.kReleaseMode ? null : "Brightness Auto");


        public static readonly LogicalKeyboardKey mediaLast =
            new LogicalKeyboardKey(0x001000c0083, debugName: foundation_.kReleaseMode ? null : "Media Last");


        public static readonly LogicalKeyboardKey launchPhone = new LogicalKeyboardKey(0x001000c008c,
            debugName: foundation_.kReleaseMode ? null : "Launch Phone");


        public static readonly LogicalKeyboardKey programGuide = new LogicalKeyboardKey(0x001000c008d,
            debugName: foundation_.kReleaseMode ? null : "Program Guide");


        public static readonly LogicalKeyboardKey exit =
            new LogicalKeyboardKey(0x001000c0094, debugName: foundation_.kReleaseMode ? null : "Exit");


        public static readonly LogicalKeyboardKey channelUp =
            new LogicalKeyboardKey(0x001000c009c, debugName: foundation_.kReleaseMode ? null : "Channel Up");


        public static readonly LogicalKeyboardKey channelDown = new LogicalKeyboardKey(0x001000c009d,
            debugName: foundation_.kReleaseMode ? null : "Channel Down");


        public static readonly LogicalKeyboardKey mediaPlay =
            new LogicalKeyboardKey(0x001000c00b0, debugName: foundation_.kReleaseMode ? null : "Media Play");


        public static readonly LogicalKeyboardKey mediaPause =
            new LogicalKeyboardKey(0x001000c00b1, debugName: foundation_.kReleaseMode ? null : "Media Pause");


        public static readonly LogicalKeyboardKey mediaRecord = new LogicalKeyboardKey(0x001000c00b2,
            debugName: foundation_.kReleaseMode ? null : "Media Record");


        public static readonly LogicalKeyboardKey mediaFastForward = new LogicalKeyboardKey(0x001000c00b3,
            debugName: foundation_.kReleaseMode ? null : "Media Fast Forward");


        public static readonly LogicalKeyboardKey mediaRewind = new LogicalKeyboardKey(0x001000c00b4,
            debugName: foundation_.kReleaseMode ? null : "Media Rewind");


        public static readonly LogicalKeyboardKey mediaTrackNext = new LogicalKeyboardKey(0x001000c00b5,
            debugName: foundation_.kReleaseMode ? null : "Media Track Next");


        public static readonly LogicalKeyboardKey mediaTrackPrevious = new LogicalKeyboardKey(0x001000c00b6,
            debugName: foundation_.kReleaseMode ? null : "Media Track Previous");


        public static readonly LogicalKeyboardKey mediaStop =
            new LogicalKeyboardKey(0x001000c00b7, debugName: foundation_.kReleaseMode ? null : "Media Stop");


        public static readonly LogicalKeyboardKey eject =
            new LogicalKeyboardKey(0x001000c00b8, debugName: foundation_.kReleaseMode ? null : "Eject");


        public static readonly LogicalKeyboardKey mediaPlayPause = new LogicalKeyboardKey(0x001000c00cd,
            debugName: foundation_.kReleaseMode ? null : "Media Play Pause");


        public static readonly LogicalKeyboardKey speechInputToggle = new LogicalKeyboardKey(0x001000c00cf,
            debugName: foundation_.kReleaseMode ? null : "Speech Input Toggle");


        public static readonly LogicalKeyboardKey bassBoost =
            new LogicalKeyboardKey(0x001000c00e5, debugName: foundation_.kReleaseMode ? null : "Bass Boost");


        public static readonly LogicalKeyboardKey mediaSelect = new LogicalKeyboardKey(0x001000c0183,
            debugName: foundation_.kReleaseMode ? null : "Media Select");


        public static readonly LogicalKeyboardKey launchWordProcessor = new LogicalKeyboardKey(0x001000c0184,
            debugName: foundation_.kReleaseMode ? null : "Launch Word Processo");


        public static readonly LogicalKeyboardKey launchSpreadsheet = new LogicalKeyboardKey(0x001000c0186,
            debugName: foundation_.kReleaseMode ? null : "Launch Spreadsheet");


        public static readonly LogicalKeyboardKey launchMail =
            new LogicalKeyboardKey(0x001000c018a, debugName: foundation_.kReleaseMode ? null : "Launch Mail");


        public static readonly LogicalKeyboardKey launchContacts = new LogicalKeyboardKey(0x001000c018d,
            debugName: foundation_.kReleaseMode ? null : "Launch Contacts");


        public static readonly LogicalKeyboardKey launchCalendar = new LogicalKeyboardKey(0x001000c018e,
            debugName: foundation_.kReleaseMode ? null : "Launch Calenda");


        public static readonly LogicalKeyboardKey launchApp2 =
            new LogicalKeyboardKey(0x001000c0192, debugName: foundation_.kReleaseMode ? null : "Launch App2");


        public static readonly LogicalKeyboardKey launchApp1 =
            new LogicalKeyboardKey(0x001000c0194, debugName: foundation_.kReleaseMode ? null : "Launch App1");


        public static readonly LogicalKeyboardKey launchInternetBrowser = new LogicalKeyboardKey(0x001000c0196,
            debugName: foundation_.kReleaseMode ? null : "Launch Internet Browse");


        public static readonly LogicalKeyboardKey logOff =
            new LogicalKeyboardKey(0x001000c019c, debugName: foundation_.kReleaseMode ? null : "Log Off");


        public static readonly LogicalKeyboardKey lockScreen =
            new LogicalKeyboardKey(0x001000c019e, debugName: foundation_.kReleaseMode ? null : "Lock Screen");


        public static readonly LogicalKeyboardKey launchControlPanel = new LogicalKeyboardKey(0x001000c019f,
            debugName: foundation_.kReleaseMode ? null : "Launch Control Panel");


        public static readonly LogicalKeyboardKey selectTask =
            new LogicalKeyboardKey(0x001000c01a2, debugName: foundation_.kReleaseMode ? null : "Select Task");


        public static readonly LogicalKeyboardKey launchDocuments = new LogicalKeyboardKey(0x001000c01a7,
            debugName: foundation_.kReleaseMode ? null : "Launch Documents");


        public static readonly LogicalKeyboardKey spellCheck =
            new LogicalKeyboardKey(0x001000c01ab, debugName: foundation_.kReleaseMode ? null : "Spell Check");


        public static readonly LogicalKeyboardKey launchKeyboardLayout = new LogicalKeyboardKey(0x001000c01ae,
            debugName: foundation_.kReleaseMode ? null : "Launch Keyboard Layout");


        public static readonly LogicalKeyboardKey launchScreenSaver = new LogicalKeyboardKey(0x001000c01b1,
            debugName: foundation_.kReleaseMode ? null : "Launch Screen Save");


        public static readonly LogicalKeyboardKey launchAssistant = new LogicalKeyboardKey(0x001000c01cb,
            debugName: foundation_.kReleaseMode ? null : "Launch Assistant");


        public static readonly LogicalKeyboardKey launchAudioBrowser = new LogicalKeyboardKey(0x001000c01b7,
            debugName: foundation_.kReleaseMode ? null : "Launch Audio Browse");


        public static readonly LogicalKeyboardKey newKey =
            new LogicalKeyboardKey(0x001000c0201, debugName: foundation_.kReleaseMode ? null : "New Key");


        public static readonly LogicalKeyboardKey close =
            new LogicalKeyboardKey(0x001000c0203, debugName: foundation_.kReleaseMode ? null : "Close");


        public static readonly LogicalKeyboardKey save =
            new LogicalKeyboardKey(0x001000c0207, debugName: foundation_.kReleaseMode ? null : "Save");


        public static readonly LogicalKeyboardKey print =
            new LogicalKeyboardKey(0x001000c0208, debugName: foundation_.kReleaseMode ? null : "Print");


        public static readonly LogicalKeyboardKey browserSearch = new LogicalKeyboardKey(0x001000c0221,
            debugName: foundation_.kReleaseMode ? null : "Browser Search");


        public static readonly LogicalKeyboardKey browserHome = new LogicalKeyboardKey(0x001000c0223,
            debugName: foundation_.kReleaseMode ? null : "Browser Home");


        public static readonly LogicalKeyboardKey browserBack = new LogicalKeyboardKey(0x001000c0224,
            debugName: foundation_.kReleaseMode ? null : "Browser Back");


        public static readonly LogicalKeyboardKey browserForward = new LogicalKeyboardKey(0x001000c0225,
            debugName: foundation_.kReleaseMode ? null : "Browser Forward");


        public static readonly LogicalKeyboardKey browserStop = new LogicalKeyboardKey(0x001000c0226,
            debugName: foundation_.kReleaseMode ? null : "Browser Stop");


        public static readonly LogicalKeyboardKey browserRefresh = new LogicalKeyboardKey(0x001000c0227,
            debugName: foundation_.kReleaseMode ? null : "Browser Refresh");


        public static readonly LogicalKeyboardKey browserFavorites = new LogicalKeyboardKey(0x001000c022a,
            debugName: foundation_.kReleaseMode ? null : "Browser Favorites");


        public static readonly LogicalKeyboardKey zoomIn =
            new LogicalKeyboardKey(0x001000c022d, debugName: foundation_.kReleaseMode ? null : "Zoom In");


        public static readonly LogicalKeyboardKey zoomOut =
            new LogicalKeyboardKey(0x001000c022e, debugName: foundation_.kReleaseMode ? null : "Zoom Out");


        public static readonly LogicalKeyboardKey zoomToggle =
            new LogicalKeyboardKey(0x001000c0232, debugName: foundation_.kReleaseMode ? null : "Zoom Toggle");


        public static readonly LogicalKeyboardKey redo =
            new LogicalKeyboardKey(0x001000c0279, debugName: foundation_.kReleaseMode ? null : "Redo");


        public static readonly LogicalKeyboardKey mailReply =
            new LogicalKeyboardKey(0x001000c0289, debugName: foundation_.kReleaseMode ? null : "Mail Reply");


        public static readonly LogicalKeyboardKey mailForward = new LogicalKeyboardKey(0x001000c028b,
            debugName: foundation_.kReleaseMode ? null : "Mail Forward");


        public static readonly LogicalKeyboardKey mailSend =
            new LogicalKeyboardKey(0x001000c028c, debugName: foundation_.kReleaseMode ? null : "Mail Send");


        public static readonly LogicalKeyboardKey keyboardLayoutSelect = new LogicalKeyboardKey(0x001000c029d,
            debugName: foundation_.kReleaseMode ? null : "Keyboard Layout Select");


        public static readonly LogicalKeyboardKey showAllWindows = new LogicalKeyboardKey(0x001000c029f,
            debugName: foundation_.kReleaseMode ? null : "Show All Windows");


        public static readonly LogicalKeyboardKey gameButton1 = new LogicalKeyboardKey(0x0010005ff01,
            debugName: foundation_.kReleaseMode ? null : "Game Button 1");


        public static readonly LogicalKeyboardKey gameButton2 = new LogicalKeyboardKey(0x0010005ff02,
            debugName: foundation_.kReleaseMode ? null : "Game Button 2");


        public static readonly LogicalKeyboardKey gameButton3 = new LogicalKeyboardKey(0x0010005ff03,
            debugName: foundation_.kReleaseMode ? null : "Game Button 3");


        public static readonly LogicalKeyboardKey gameButton4 = new LogicalKeyboardKey(0x0010005ff04,
            debugName: foundation_.kReleaseMode ? null : "Game Button 4");


        public static readonly LogicalKeyboardKey gameButton5 = new LogicalKeyboardKey(0x0010005ff05,
            debugName: foundation_.kReleaseMode ? null : "Game Button 5");


        public static readonly LogicalKeyboardKey gameButton6 = new LogicalKeyboardKey(0x0010005ff06,
            debugName: foundation_.kReleaseMode ? null : "Game Button 6");


        public static readonly LogicalKeyboardKey gameButton7 = new LogicalKeyboardKey(0x0010005ff07,
            debugName: foundation_.kReleaseMode ? null : "Game Button 7");


        public static readonly LogicalKeyboardKey gameButton8 = new LogicalKeyboardKey(0x0010005ff08,
            debugName: foundation_.kReleaseMode ? null : "Game Button 8");


        public static readonly LogicalKeyboardKey gameButton9 = new LogicalKeyboardKey(0x0010005ff09,
            debugName: foundation_.kReleaseMode ? null : "Game Button 9");


        public static readonly LogicalKeyboardKey gameButton10 = new LogicalKeyboardKey(0x0010005ff0a,
            debugName: foundation_.kReleaseMode ? null : "Game Button 10");


        public static readonly LogicalKeyboardKey gameButton11 = new LogicalKeyboardKey(0x0010005ff0b,
            debugName: foundation_.kReleaseMode ? null : "Game Button 11");


        public static readonly LogicalKeyboardKey gameButton12 = new LogicalKeyboardKey(0x0010005ff0c,
            debugName: foundation_.kReleaseMode ? null : "Game Button 12");


        public static readonly LogicalKeyboardKey gameButton13 = new LogicalKeyboardKey(0x0010005ff0d,
            debugName: foundation_.kReleaseMode ? null : "Game Button 13");


        public static readonly LogicalKeyboardKey gameButton14 = new LogicalKeyboardKey(0x0010005ff0e,
            debugName: foundation_.kReleaseMode ? null : "Game Button 14");


        public static readonly LogicalKeyboardKey gameButton15 = new LogicalKeyboardKey(0x0010005ff0f,
            debugName: foundation_.kReleaseMode ? null : "Game Button 15");


        public static readonly LogicalKeyboardKey gameButton16 = new LogicalKeyboardKey(0x0010005ff10,
            debugName: foundation_.kReleaseMode ? null : "Game Button 16");


        public static readonly LogicalKeyboardKey gameButtonA = new LogicalKeyboardKey(0x0010005ff11,
            debugName: foundation_.kReleaseMode ? null : "Game Button A");


        public static readonly LogicalKeyboardKey gameButtonB = new LogicalKeyboardKey(0x0010005ff12,
            debugName: foundation_.kReleaseMode ? null : "Game Button B");


        public static readonly LogicalKeyboardKey gameButtonC = new LogicalKeyboardKey(0x0010005ff13,
            debugName: foundation_.kReleaseMode ? null : "Game Button C");


        public static readonly LogicalKeyboardKey gameButtonLeft1 = new LogicalKeyboardKey(0x0010005ff14,
            debugName: foundation_.kReleaseMode ? null : "Game Button Left 1");


        public static readonly LogicalKeyboardKey gameButtonLeft2 = new LogicalKeyboardKey(0x0010005ff15,
            debugName: foundation_.kReleaseMode ? null : "Game Button Left 2");


        public static readonly LogicalKeyboardKey gameButtonMode = new LogicalKeyboardKey(0x0010005ff16,
            debugName: foundation_.kReleaseMode ? null : "Game Button Mode");


        public static readonly LogicalKeyboardKey gameButtonRight1 = new LogicalKeyboardKey(0x0010005ff17,
            debugName: foundation_.kReleaseMode ? null : "Game Button Right 1");


        public static readonly LogicalKeyboardKey gameButtonRight2 = new LogicalKeyboardKey(0x0010005ff18,
            debugName: foundation_.kReleaseMode ? null : "Game Button Right 2");


        public static readonly LogicalKeyboardKey gameButtonSelect = new LogicalKeyboardKey(0x0010005ff19,
            debugName: foundation_.kReleaseMode ? null : "Game Button Select");


        public static readonly LogicalKeyboardKey gameButtonStart = new LogicalKeyboardKey(0x0010005ff1a,
            debugName: foundation_.kReleaseMode ? null : "Game Button Start");


        public static readonly LogicalKeyboardKey gameButtonThumbLeft = new LogicalKeyboardKey(0x0010005ff1b,
            debugName: foundation_.kReleaseMode ? null : "Game Button Thumb Left");


        public static readonly LogicalKeyboardKey gameButtonThumbRight = new LogicalKeyboardKey(0x0010005ff1c,
            debugName: foundation_.kReleaseMode ? null : "Game Button Thumb Right");


        public static readonly LogicalKeyboardKey gameButtonX = new LogicalKeyboardKey(0x0010005ff1d,
            debugName: foundation_.kReleaseMode ? null : "Game Button X");


        public static readonly LogicalKeyboardKey gameButtonY = new LogicalKeyboardKey(0x0010005ff1e,
            debugName: foundation_.kReleaseMode ? null : "Game Button Y");


        public static readonly LogicalKeyboardKey gameButtonZ = new LogicalKeyboardKey(0x0010005ff1f,
            debugName: foundation_.kReleaseMode ? null : "Game Button Z");


        public static readonly LogicalKeyboardKey fn =
            new LogicalKeyboardKey(0x00100000012, debugName: foundation_.kReleaseMode ? null : "Fn");


        public static readonly LogicalKeyboardKey shift =
            new LogicalKeyboardKey(0x201000700e1, debugName: foundation_.kReleaseMode ? null : "Shift");


        public static readonly LogicalKeyboardKey meta =
            new LogicalKeyboardKey(0x201000700e3, debugName: foundation_.kReleaseMode ? null : "Meta");


        public static readonly LogicalKeyboardKey alt =
            new LogicalKeyboardKey(0x201000700e2, debugName: foundation_.kReleaseMode ? null : "Alt");


        public static readonly LogicalKeyboardKey control =
            new LogicalKeyboardKey(0x201000700e0, debugName: foundation_.kReleaseMode ? null : "Control");


        // A list of all predefined constant LogicalKeyboardKeys so they can be
        // searched.
        public static readonly Dictionary<long, LogicalKeyboardKey> _knownLogicalKeys =
            new Dictionary<long, LogicalKeyboardKey> {
                {0x0100000000, none},
                {0x0100000010, hyper},
                {0x0100000011, superKey},
                {0x0100000013, fnLock},
                {0x0100000014, suspend},
                {0x0100000015, resume},
                {0x0100000016, turbo},
                {0x0100000017, privacyScreenToggle},
                {0x0100010082, sleep},
                {0x0100010083, wakeUp},
                {0x01000100b5, displayToggleIntExt},
                {0x0100070000, usbReserved},
                {0x0100070001, usbErrorRollOver},
                {0x0100070002, usbPostFail},
                {0x0100070003, usbErrorUndefined},
                {0x0000000061, keyA},
                {0x0000000062, keyB},
                {0x0000000063, keyC},
                {0x0000000064, keyD},
                {0x0000000065, keyE},
                {0x0000000066, keyF},
                {0x0000000067, keyG},
                {0x0000000068, keyH},
                {0x0000000069, keyI},
                {0x000000006a, keyJ},
                {0x000000006b, keyK},
                {0x000000006c, keyL},
                {0x000000006d, keyM},
                {0x000000006e, keyN},
                {0x000000006f, keyO},
                {0x0000000070, keyP},
                {0x0000000071, keyQ},
                {0x0000000072, keyR},
                {0x0000000073, keyS},
                {0x0000000074, keyT},
                {0x0000000075, keyU},
                {0x0000000076, keyV},
                {0x0000000077, keyW},
                {0x0000000078, keyX},
                {0x0000000079, keyY},
                {0x000000007a, keyZ},
                {0x0000000031, digit1},
                {0x0000000032, digit2},
                {0x0000000033, digit3},
                {0x0000000034, digit4},
                {0x0000000035, digit5},
                {0x0000000036, digit6},
                {0x0000000037, digit7},
                {0x0000000038, digit8},
                {0x0000000039, digit9},
                {0x0000000030, digit0},
                {0x0100070028, enter},
                {0x0100070029, escape},
                {0x010007002a, backspace},
                {0x010007002b, tab},
                {0x0000000020, space},
                {0x000000002d, minus},
                {0x000000003d, equal},
                {0x000000005b, bracketLeft},
                {0x000000005d, bracketRight},
                {0x000000005c, backslash},
                {0x000000003b, semicolon},
                {0x0000000027, quote},
                {0x0000000060, backquote},
                {0x000000002c, comma},
                {0x000000002e, period},
                {0x000000002f, slash},
                {0x0100070039, capsLock},
                {0x010007003a, f1},
                {0x010007003b, f2},
                {0x010007003c, f3},
                {0x010007003d, f4},
                {0x010007003e, f5},
                {0x010007003f, f6},
                {0x0100070040, f7},
                {0x0100070041, f8},
                {0x0100070042, f9},
                {0x0100070043, f10},
                {0x0100070044, f11},
                {0x0100070045, f12},
                {0x0100070046, printScreen},
                {0x0100070047, scrollLock},
                {0x0100070048, pause},
                {0x0100070049, insert},
                {0x010007004a, home},
                {0x010007004b, pageUp},
                {0x010007004c, delete},
                {0x010007004d, end},
                {0x010007004e, pageDown},
                {0x010007004f, arrowRight},
                {0x0100070050, arrowLeft},
                {0x0100070051, arrowDown},
                {0x0100070052, arrowUp},
                {0x0100070053, numLock},
                {0x0100070054, numpadDivide},
                {0x0100070055, numpadMultiply},
                {0x0100070056, numpadSubtract},
                {0x0100070057, numpadAdd},
                {0x0100070058, numpadEnter},
                {0x0100070059, numpad1},
                {0x010007005a, numpad2},
                {0x010007005b, numpad3},
                {0x010007005c, numpad4},
                {0x010007005d, numpad5},
                {0x010007005e, numpad6},
                {0x010007005f, numpad7},
                {0x0100070060, numpad8},
                {0x0100070061, numpad9},
                {0x0100070062, numpad0},
                {0x0100070063, numpadDecimal},
                {0x0100070064, intlBackslash},
                {0x0100070065, contextMenu},
                {0x0100070066, power},
                {0x0100070067, numpadEqual},
                {0x0100070068, f13},
                {0x0100070069, f14},
                {0x010007006a, f15},
                {0x010007006b, f16},
                {0x010007006c, f17},
                {0x010007006d, f18},
                {0x010007006e, f19},
                {0x010007006f, f20},
                {0x0100070070, f21},
                {0x0100070071, f22},
                {0x0100070072, f23},
                {0x0100070073, f24},
                {0x0100070074, open},
                {0x0100070075, help},
                {0x0100070077, select},
                {0x0100070079, again},
                {0x010007007a, undo},
                {0x010007007b, cut},
                {0x010007007c, copy},
                {0x010007007d, paste},
                {0x010007007e, find},
                {0x010007007f, audioVolumeMute},
                {0x0100070080, audioVolumeUp},
                {0x0100070081, audioVolumeDown},
                {0x0100070085, numpadComma},
                {0x0100070087, intlRo},
                {0x0100070088, kanaMode},
                {0x0100070089, intlYen},
                {0x010007008a, convert},
                {0x010007008b, nonConvert},
                {0x0100070090, lang1},
                {0x0100070091, lang2},
                {0x0100070092, lang3},
                {0x0100070093, lang4},
                {0x0100070094, lang5},
                {0x010007009b, abort},
                {0x01000700a3, props},
                {0x01000700b6, numpadParenLeft},
                {0x01000700b7, numpadParenRight},
                {0x01000700bb, numpadBackspace},
                {0x01000700d0, numpadMemoryStore},
                {0x01000700d1, numpadMemoryRecall},
                {0x01000700d2, numpadMemoryClear},
                {0x01000700d3, numpadMemoryAdd},
                {0x01000700d4, numpadMemorySubtract},
                {0x01000700d7, numpadSignChange},
                {0x01000700d8, numpadClear},
                {0x01000700d9, numpadClearEntry},
                {0x01000700e0, controlLeft},
                {0x01000700e1, shiftLeft},
                {0x01000700e2, altLeft},
                {0x01000700e3, metaLeft},
                {0x01000700e4, controlRight},
                {0x01000700e5, shiftRight},
                {0x01000700e6, altRight},
                {0x01000700e7, metaRight},
                {0x01000c0060, info},
                {0x01000c0061, closedCaptionToggle},
                {0x01000c006f, brightnessUp},
                {0x01000c0070, brightnessDown},
                {0x01000c0072, brightnessToggle},
                {0x01000c0073, brightnessMinimum},
                {0x01000c0074, brightnessMaximum},
                {0x01000c0075, brightnessAuto},
                {0x01000c0083, mediaLast},
                {0x01000c008c, launchPhone},
                {0x01000c008d, programGuide},
                {0x01000c0094, exit},
                {0x01000c009c, channelUp},
                {0x01000c009d, channelDown},
                {0x01000c00b0, mediaPlay},
                {0x01000c00b1, mediaPause},
                {0x01000c00b2, mediaRecord},
                {0x01000c00b3, mediaFastForward},
                {0x01000c00b4, mediaRewind},
                {0x01000c00b5, mediaTrackNext},
                {0x01000c00b6, mediaTrackPrevious},
                {0x01000c00b7, mediaStop},
                {0x01000c00b8, eject},
                {0x01000c00cd, mediaPlayPause},
                {0x01000c00cf, speechInputToggle},
                {0x01000c00e5, bassBoost},
                {0x01000c0183, mediaSelect},
                {0x01000c0184, launchWordProcessor},
                {0x01000c0186, launchSpreadsheet},
                {0x01000c018a, launchMail},
                {0x01000c018d, launchContacts},
                {0x01000c018e, launchCalendar},
                {0x01000c0192, launchApp2},
                {0x01000c0194, launchApp1},
                {0x01000c0196, launchInternetBrowser},
                {0x01000c019c, logOff},
                {0x01000c019e, lockScreen},
                {0x01000c019f, launchControlPanel},
                {0x01000c01a2, selectTask},
                {0x01000c01a7, launchDocuments},
                {0x01000c01ab, spellCheck},
                {0x01000c01ae, launchKeyboardLayout},
                {0x01000c01b1, launchScreenSaver},
                {0x01000c01cb, launchAssistant},
                {0x01000c01b7, launchAudioBrowser},
                {0x01000c0201, newKey},
                {0x01000c0203, close},
                {0x01000c0207, save},
                {0x01000c0208, print},
                {0x01000c0221, browserSearch},
                {0x01000c0223, browserHome},
                {0x01000c0224, browserBack},
                {0x01000c0225, browserForward},
                {0x01000c0226, browserStop},
                {0x01000c0227, browserRefresh},
                {0x01000c022a, browserFavorites},
                {0x01000c022d, zoomIn},
                {0x01000c022e, zoomOut},
                {0x01000c0232, zoomToggle},
                {0x01000c0279, redo},
                {0x01000c0289, mailReply},
                {0x01000c028b, mailForward},
                {0x01000c028c, mailSend},
                {0x01000c029d, keyboardLayoutSelect},
                {0x01000c029f, showAllWindows},
                {0x010005ff01, gameButton1},
                {0x010005ff02, gameButton2},
                {0x010005ff03, gameButton3},
                {0x010005ff04, gameButton4},
                {0x010005ff05, gameButton5},
                {0x010005ff06, gameButton6},
                {0x010005ff07, gameButton7},
                {0x010005ff08, gameButton8},
                {0x010005ff09, gameButton9},
                {0x010005ff0a, gameButton10},
                {0x010005ff0b, gameButton11},
                {0x010005ff0c, gameButton12},
                {0x010005ff0d, gameButton13},
                {0x010005ff0e, gameButton14},
                {0x010005ff0f, gameButton15},
                {0x010005ff10, gameButton16},
                {0x010005ff11, gameButtonA},
                {0x010005ff12, gameButtonB},
                {0x010005ff13, gameButtonC},
                {0x010005ff14, gameButtonLeft1},
                {0x010005ff15, gameButtonLeft2},
                {0x010005ff16, gameButtonMode},
                {0x010005ff17, gameButtonRight1},
                {0x010005ff18, gameButtonRight2},
                {0x010005ff19, gameButtonSelect},
                {0x010005ff1a, gameButtonStart},
                {0x010005ff1b, gameButtonThumbLeft},
                {0x010005ff1c, gameButtonThumbRight},
                {0x010005ff1d, gameButtonX},
                {0x010005ff1e, gameButtonY},
                {0x010005ff1f, gameButtonZ},
                {0x0100000012, fn},
                {0x201000700e1, shift},
                {0x201000700e3, meta},
                {0x201000700e2, alt},
                {0x201000700e0, control}
            };

        public static readonly Dictionary<LogicalKeyboardKey, LogicalKeyboardKey> _synonyms =
            new Dictionary<LogicalKeyboardKey, LogicalKeyboardKey> {
                {shiftLeft, shift},
                {shiftRight, shift},
                {metaLeft, meta},
                {metaRight, meta},
                {altLeft, alt},
                {altRight, alt},
                {controlLeft, control},
                {controlRight, control},
            };
    }

    public class PhysicalKeyboardKey : KeyboardKey, IEquatable<PhysicalKeyboardKey> {
        protected PhysicalKeyboardKey(int usbHidUsage, string debugName = null) {
            D.assert(usbHidUsage != null);
            this.usbHidUsage = usbHidUsage;
            this.debugName = debugName;
        }

        public readonly int usbHidUsage;

        public readonly string debugName;

        public static PhysicalKeyboardKey findKeyByCode(int usageCode) {
            return _knownPhysicalKeys[usageCode];
        }

        public bool Equals(PhysicalKeyboardKey other) {
            if (ReferenceEquals(null, other)) {
                return false;
            }

            if (ReferenceEquals(this, other)) {
                return true;
            }

            return usbHidUsage == other.usbHidUsage;
        }

        public override bool Equals(object obj) {
            if (ReferenceEquals(null, obj)) {
                return false;
            }

            if (ReferenceEquals(this, obj)) {
                return true;
            }

            if (obj.GetType() != GetType()) {
                return false;
            }

            return Equals((PhysicalKeyboardKey) obj);
        }

        public override int GetHashCode() {
            unchecked {
                return (usbHidUsage * 397) ^ (debugName?.GetHashCode() ?? 0);
            }
        }

        public override void debugFillProperties(DiagnosticPropertiesBuilder properties) {
            base.debugFillProperties(properties);
            properties.add(new StringProperty("usbHidUsage", usbHidUsage.ToString().PadLeft(8, '0'), showName: true));
            properties.add(new StringProperty("debugName", debugName, showName: true, defaultValue: null));
        }

        public static PhysicalKeyboardKey none =
            new PhysicalKeyboardKey(0x00000000, debugName: foundation_.kReleaseMode ? null : "None");

        public static PhysicalKeyboardKey hyper =
            new PhysicalKeyboardKey(0x00000010, debugName: foundation_.kReleaseMode ? null : "Hyper");

        public static PhysicalKeyboardKey superKey =
            new PhysicalKeyboardKey(0x00000011, debugName: foundation_.kReleaseMode ? null : "Super Key");

        public static PhysicalKeyboardKey fnLock =
            new PhysicalKeyboardKey(0x00000013, debugName: foundation_.kReleaseMode ? null : "Fn Lock");

        public static PhysicalKeyboardKey suspend =
            new PhysicalKeyboardKey(0x00000014, debugName: foundation_.kReleaseMode ? null : "Suspend");

        public static PhysicalKeyboardKey resume =
            new PhysicalKeyboardKey(0x00000015, debugName: foundation_.kReleaseMode ? null : "Resume");

        public static PhysicalKeyboardKey turbo =
            new PhysicalKeyboardKey(0x00000016, debugName: foundation_.kReleaseMode ? null : "Turbo");

        public static PhysicalKeyboardKey privacyScreenToggle = new PhysicalKeyboardKey(0x00000017,
            debugName: foundation_.kReleaseMode ? null : "Privacy Screen Toggle");

        public static PhysicalKeyboardKey sleep =
            new PhysicalKeyboardKey(0x00010082, debugName: foundation_.kReleaseMode ? null : "Sleep");

        public static PhysicalKeyboardKey wakeUp =
            new PhysicalKeyboardKey(0x00010083, debugName: foundation_.kReleaseMode ? null : "Wake Up");

        public static PhysicalKeyboardKey displayToggleIntExt = new PhysicalKeyboardKey(0x000100b5,
            debugName: foundation_.kReleaseMode ? null : "Display Toggle Int Ext");

        public static PhysicalKeyboardKey usbReserved =
            new PhysicalKeyboardKey(0x00070000, debugName: foundation_.kReleaseMode ? null : "Usb Reserved");

        public static PhysicalKeyboardKey usbErrorRollOver = new PhysicalKeyboardKey(0x00070001,
            debugName: foundation_.kReleaseMode ? null : "Usb Error Roll Over");

        public static PhysicalKeyboardKey usbPostFail =
            new PhysicalKeyboardKey(0x00070002, debugName: foundation_.kReleaseMode ? null : "Usb Post Fail");

        public static PhysicalKeyboardKey usbErrorUndefined = new PhysicalKeyboardKey(0x00070003,
            debugName: foundation_.kReleaseMode ? null : "Usb Error Undefined");

        public static PhysicalKeyboardKey keyA =
            new PhysicalKeyboardKey(0x00070004, debugName: foundation_.kReleaseMode ? null : "Key A");

        public static PhysicalKeyboardKey keyB =
            new PhysicalKeyboardKey(0x00070005, debugName: foundation_.kReleaseMode ? null : "Key B");

        public static PhysicalKeyboardKey keyC =
            new PhysicalKeyboardKey(0x00070006, debugName: foundation_.kReleaseMode ? null : "Key C");

        public static PhysicalKeyboardKey keyD =
            new PhysicalKeyboardKey(0x00070007, debugName: foundation_.kReleaseMode ? null : "Key D");

        public static PhysicalKeyboardKey keyE =
            new PhysicalKeyboardKey(0x00070008, debugName: foundation_.kReleaseMode ? null : "Key E");

        public static PhysicalKeyboardKey keyF =
            new PhysicalKeyboardKey(0x00070009, debugName: foundation_.kReleaseMode ? null : "Key F");

        public static PhysicalKeyboardKey keyG =
            new PhysicalKeyboardKey(0x0007000a, debugName: foundation_.kReleaseMode ? null : "Key G");

        public static PhysicalKeyboardKey keyH =
            new PhysicalKeyboardKey(0x0007000b, debugName: foundation_.kReleaseMode ? null : "Key H");

        public static PhysicalKeyboardKey keyI =
            new PhysicalKeyboardKey(0x0007000c, debugName: foundation_.kReleaseMode ? null : "Key I");

        public static PhysicalKeyboardKey keyJ =
            new PhysicalKeyboardKey(0x0007000d, debugName: foundation_.kReleaseMode ? null : "Key J");

        public static PhysicalKeyboardKey keyK =
            new PhysicalKeyboardKey(0x0007000e, debugName: foundation_.kReleaseMode ? null : "Key K");

        public static PhysicalKeyboardKey keyL =
            new PhysicalKeyboardKey(0x0007000f, debugName: foundation_.kReleaseMode ? null : "Key L");

        public static PhysicalKeyboardKey keyM =
            new PhysicalKeyboardKey(0x00070010, debugName: foundation_.kReleaseMode ? null : "Key M");

        public static PhysicalKeyboardKey keyN =
            new PhysicalKeyboardKey(0x00070011, debugName: foundation_.kReleaseMode ? null : "Key N");

        public static PhysicalKeyboardKey keyO =
            new PhysicalKeyboardKey(0x00070012, debugName: foundation_.kReleaseMode ? null : "Key O");

        public static PhysicalKeyboardKey keyP =
            new PhysicalKeyboardKey(0x00070013, debugName: foundation_.kReleaseMode ? null : "Key P");

        public static PhysicalKeyboardKey keyQ =
            new PhysicalKeyboardKey(0x00070014, debugName: foundation_.kReleaseMode ? null : "Key Q");

        public static PhysicalKeyboardKey keyR =
            new PhysicalKeyboardKey(0x00070015, debugName: foundation_.kReleaseMode ? null : "Key R");

        public static PhysicalKeyboardKey keyS =
            new PhysicalKeyboardKey(0x00070016, debugName: foundation_.kReleaseMode ? null : "Key S");

        public static PhysicalKeyboardKey keyT =
            new PhysicalKeyboardKey(0x00070017, debugName: foundation_.kReleaseMode ? null : "Key T");

        public static PhysicalKeyboardKey keyU =
            new PhysicalKeyboardKey(0x00070018, debugName: foundation_.kReleaseMode ? null : "Key U");

        public static PhysicalKeyboardKey keyV =
            new PhysicalKeyboardKey(0x00070019, debugName: foundation_.kReleaseMode ? null : "Key V");

        public static PhysicalKeyboardKey keyW =
            new PhysicalKeyboardKey(0x0007001a, debugName: foundation_.kReleaseMode ? null : "Key W");

        public static PhysicalKeyboardKey keyX =
            new PhysicalKeyboardKey(0x0007001b, debugName: foundation_.kReleaseMode ? null : "Key X");

        public static PhysicalKeyboardKey keyY =
            new PhysicalKeyboardKey(0x0007001c, debugName: foundation_.kReleaseMode ? null : "Key Y");

        public static PhysicalKeyboardKey keyZ =
            new PhysicalKeyboardKey(0x0007001d, debugName: foundation_.kReleaseMode ? null : "Key Z");

        public static PhysicalKeyboardKey digit1 =
            new PhysicalKeyboardKey(0x0007001e, debugName: foundation_.kReleaseMode ? null : "Digit 1");

        public static PhysicalKeyboardKey digit2 =
            new PhysicalKeyboardKey(0x0007001f, debugName: foundation_.kReleaseMode ? null : "Digit 2");

        public static PhysicalKeyboardKey digit3 =
            new PhysicalKeyboardKey(0x00070020, debugName: foundation_.kReleaseMode ? null : "Digit 3");

        public static PhysicalKeyboardKey digit4 =
            new PhysicalKeyboardKey(0x00070021, debugName: foundation_.kReleaseMode ? null : "Digit 4");

        public static PhysicalKeyboardKey digit5 =
            new PhysicalKeyboardKey(0x00070022, debugName: foundation_.kReleaseMode ? null : "Digit 5");

        public static PhysicalKeyboardKey digit6 =
            new PhysicalKeyboardKey(0x00070023, debugName: foundation_.kReleaseMode ? null : "Digit 6");

        public static PhysicalKeyboardKey digit7 =
            new PhysicalKeyboardKey(0x00070024, debugName: foundation_.kReleaseMode ? null : "Digit 7");

        public static PhysicalKeyboardKey digit8 =
            new PhysicalKeyboardKey(0x00070025, debugName: foundation_.kReleaseMode ? null : "Digit 8");

        public static PhysicalKeyboardKey digit9 =
            new PhysicalKeyboardKey(0x00070026, debugName: foundation_.kReleaseMode ? null : "Digit 9");

        public static PhysicalKeyboardKey digit0 =
            new PhysicalKeyboardKey(0x00070027, debugName: foundation_.kReleaseMode ? null : "Digit 0");

        public static PhysicalKeyboardKey enter =
            new PhysicalKeyboardKey(0x00070028, debugName: foundation_.kReleaseMode ? null : "Enter");

        public static PhysicalKeyboardKey escape =
            new PhysicalKeyboardKey(0x00070029, debugName: foundation_.kReleaseMode ? null : "Escape");

        public static PhysicalKeyboardKey backspace =
            new PhysicalKeyboardKey(0x0007002a, debugName: foundation_.kReleaseMode ? null : "Backspace");

        public static PhysicalKeyboardKey tab =
            new PhysicalKeyboardKey(0x0007002b, debugName: foundation_.kReleaseMode ? null : "Tab");

        public static PhysicalKeyboardKey space =
            new PhysicalKeyboardKey(0x0007002c, debugName: foundation_.kReleaseMode ? null : "Space");

        public static PhysicalKeyboardKey minus =
            new PhysicalKeyboardKey(0x0007002d, debugName: foundation_.kReleaseMode ? null : "Minus");

        public static PhysicalKeyboardKey equal =
            new PhysicalKeyboardKey(0x0007002e, debugName: foundation_.kReleaseMode ? null : "Equal");

        public static PhysicalKeyboardKey bracketLeft =
            new PhysicalKeyboardKey(0x0007002f, debugName: foundation_.kReleaseMode ? null : "Bracket Left");

        public static PhysicalKeyboardKey bracketRight =
            new PhysicalKeyboardKey(0x00070030, debugName: foundation_.kReleaseMode ? null : "Bracket Right");

        public static PhysicalKeyboardKey backslash =
            new PhysicalKeyboardKey(0x00070031, debugName: foundation_.kReleaseMode ? null : "Backslash");

        public static PhysicalKeyboardKey semicolon =
            new PhysicalKeyboardKey(0x00070033, debugName: foundation_.kReleaseMode ? null : "Semicolon");

        public static PhysicalKeyboardKey quote =
            new PhysicalKeyboardKey(0x00070034, debugName: foundation_.kReleaseMode ? null : "Quote");

        public static PhysicalKeyboardKey backquote =
            new PhysicalKeyboardKey(0x00070035, debugName: foundation_.kReleaseMode ? null : "Backquote");

        public static PhysicalKeyboardKey comma =
            new PhysicalKeyboardKey(0x00070036, debugName: foundation_.kReleaseMode ? null : "Comma");

        public static PhysicalKeyboardKey period =
            new PhysicalKeyboardKey(0x00070037, debugName: foundation_.kReleaseMode ? null : "Period");

        public static PhysicalKeyboardKey slash =
            new PhysicalKeyboardKey(0x00070038, debugName: foundation_.kReleaseMode ? null : "Slash");

        public static PhysicalKeyboardKey capsLock =
            new PhysicalKeyboardKey(0x00070039, debugName: foundation_.kReleaseMode ? null : "Caps Lock");

        public static PhysicalKeyboardKey f1 =
            new PhysicalKeyboardKey(0x0007003a, debugName: foundation_.kReleaseMode ? null : "F1");

        public static PhysicalKeyboardKey f2 =
            new PhysicalKeyboardKey(0x0007003b, debugName: foundation_.kReleaseMode ? null : "F2");

        public static PhysicalKeyboardKey f3 =
            new PhysicalKeyboardKey(0x0007003c, debugName: foundation_.kReleaseMode ? null : "F3");

        public static PhysicalKeyboardKey f4 =
            new PhysicalKeyboardKey(0x0007003d, debugName: foundation_.kReleaseMode ? null : "F4");

        public static PhysicalKeyboardKey f5 =
            new PhysicalKeyboardKey(0x0007003e, debugName: foundation_.kReleaseMode ? null : "F5");

        public static PhysicalKeyboardKey f6 =
            new PhysicalKeyboardKey(0x0007003f, debugName: foundation_.kReleaseMode ? null : "F6");

        public static PhysicalKeyboardKey f7 =
            new PhysicalKeyboardKey(0x00070040, debugName: foundation_.kReleaseMode ? null : "F7");

        public static PhysicalKeyboardKey f8 =
            new PhysicalKeyboardKey(0x00070041, debugName: foundation_.kReleaseMode ? null : "F8");

        public static PhysicalKeyboardKey f9 =
            new PhysicalKeyboardKey(0x00070042, debugName: foundation_.kReleaseMode ? null : "F9");

        public static PhysicalKeyboardKey f10 =
            new PhysicalKeyboardKey(0x00070043, debugName: foundation_.kReleaseMode ? null : "F10");

        public static PhysicalKeyboardKey f11 =
            new PhysicalKeyboardKey(0x00070044, debugName: foundation_.kReleaseMode ? null : "F11");

        public static PhysicalKeyboardKey f12 =
            new PhysicalKeyboardKey(0x00070045, debugName: foundation_.kReleaseMode ? null : "F12");

        public static PhysicalKeyboardKey printScreen =
            new PhysicalKeyboardKey(0x00070046, debugName: foundation_.kReleaseMode ? null : "Print Screen");

        public static PhysicalKeyboardKey scrollLock =
            new PhysicalKeyboardKey(0x00070047, debugName: foundation_.kReleaseMode ? null : "Scroll Lock");

        public static PhysicalKeyboardKey pause =
            new PhysicalKeyboardKey(0x00070048, debugName: foundation_.kReleaseMode ? null : "Pause");

        public static PhysicalKeyboardKey insert =
            new PhysicalKeyboardKey(0x00070049, debugName: foundation_.kReleaseMode ? null : "Insert");

        public static PhysicalKeyboardKey home =
            new PhysicalKeyboardKey(0x0007004a, debugName: foundation_.kReleaseMode ? null : "Home");

        public static PhysicalKeyboardKey pageUp =
            new PhysicalKeyboardKey(0x0007004b, debugName: foundation_.kReleaseMode ? null : "Page Up");

        public static PhysicalKeyboardKey delete =
            new PhysicalKeyboardKey(0x0007004c, debugName: foundation_.kReleaseMode ? null : "Delete");

        public static PhysicalKeyboardKey end =
            new PhysicalKeyboardKey(0x0007004d, debugName: foundation_.kReleaseMode ? null : "End");

        public static PhysicalKeyboardKey pageDown =
            new PhysicalKeyboardKey(0x0007004e, debugName: foundation_.kReleaseMode ? null : "Page Down");

        public static PhysicalKeyboardKey arrowRight =
            new PhysicalKeyboardKey(0x0007004f, debugName: foundation_.kReleaseMode ? null : "Arrow Right");

        public static PhysicalKeyboardKey arrowLeft =
            new PhysicalKeyboardKey(0x00070050, debugName: foundation_.kReleaseMode ? null : "Arrow Left");

        public static PhysicalKeyboardKey arrowDown =
            new PhysicalKeyboardKey(0x00070051, debugName: foundation_.kReleaseMode ? null : "Arrow Down");

        public static PhysicalKeyboardKey arrowUp =
            new PhysicalKeyboardKey(0x00070052, debugName: foundation_.kReleaseMode ? null : "Arrow Up");

        public static PhysicalKeyboardKey numLock =
            new PhysicalKeyboardKey(0x00070053, debugName: foundation_.kReleaseMode ? null : "Num Lock");

        public static PhysicalKeyboardKey numpadDivide =
            new PhysicalKeyboardKey(0x00070054, debugName: foundation_.kReleaseMode ? null : "Numpad Divide");

        public static PhysicalKeyboardKey numpadMultiply = new PhysicalKeyboardKey(0x00070055,
            debugName: foundation_.kReleaseMode ? null : "Numpad Multiply");

        public static PhysicalKeyboardKey numpadSubtract = new PhysicalKeyboardKey(0x00070056,
            debugName: foundation_.kReleaseMode ? null : "Numpad Subtract");

        public static PhysicalKeyboardKey numpadAdd =
            new PhysicalKeyboardKey(0x00070057, debugName: foundation_.kReleaseMode ? null : "Numpad Add");

        public static PhysicalKeyboardKey numpadEnter =
            new PhysicalKeyboardKey(0x00070058, debugName: foundation_.kReleaseMode ? null : "Numpad Enter");

        public static PhysicalKeyboardKey numpad1 =
            new PhysicalKeyboardKey(0x00070059, debugName: foundation_.kReleaseMode ? null : "Numpad 1");

        public static PhysicalKeyboardKey numpad2 =
            new PhysicalKeyboardKey(0x0007005a, debugName: foundation_.kReleaseMode ? null : "Numpad 2");

        public static PhysicalKeyboardKey numpad3 =
            new PhysicalKeyboardKey(0x0007005b, debugName: foundation_.kReleaseMode ? null : "Numpad 3");

        public static PhysicalKeyboardKey numpad4 =
            new PhysicalKeyboardKey(0x0007005c, debugName: foundation_.kReleaseMode ? null : "Numpad 4");

        public static PhysicalKeyboardKey numpad5 =
            new PhysicalKeyboardKey(0x0007005d, debugName: foundation_.kReleaseMode ? null : "Numpad 5");

        public static PhysicalKeyboardKey numpad6 =
            new PhysicalKeyboardKey(0x0007005e, debugName: foundation_.kReleaseMode ? null : "Numpad 6");

        public static PhysicalKeyboardKey numpad7 =
            new PhysicalKeyboardKey(0x0007005f, debugName: foundation_.kReleaseMode ? null : "Numpad 7");

        public static PhysicalKeyboardKey numpad8 =
            new PhysicalKeyboardKey(0x00070060, debugName: foundation_.kReleaseMode ? null : "Numpad 8");

        public static PhysicalKeyboardKey numpad9 =
            new PhysicalKeyboardKey(0x00070061, debugName: foundation_.kReleaseMode ? null : "Numpad 9");

        public static PhysicalKeyboardKey numpad0 =
            new PhysicalKeyboardKey(0x00070062, debugName: foundation_.kReleaseMode ? null : "Numpad 0");

        public static PhysicalKeyboardKey numpadDecimal =
            new PhysicalKeyboardKey(0x00070063, debugName: foundation_.kReleaseMode ? null : "Numpad Decimal");

        public static PhysicalKeyboardKey intlBackslash =
            new PhysicalKeyboardKey(0x00070064, debugName: foundation_.kReleaseMode ? null : "Intl Backslash");

        public static PhysicalKeyboardKey contextMenu =
            new PhysicalKeyboardKey(0x00070065, debugName: foundation_.kReleaseMode ? null : "Context Menu");

        public static PhysicalKeyboardKey power =
            new PhysicalKeyboardKey(0x00070066, debugName: foundation_.kReleaseMode ? null : "Power");

        public static PhysicalKeyboardKey numpadEqual =
            new PhysicalKeyboardKey(0x00070067, debugName: foundation_.kReleaseMode ? null : "Numpad Equal");

        public static PhysicalKeyboardKey f13 =
            new PhysicalKeyboardKey(0x00070068, debugName: foundation_.kReleaseMode ? null : "F13");

        public static PhysicalKeyboardKey f14 =
            new PhysicalKeyboardKey(0x00070069, debugName: foundation_.kReleaseMode ? null : "F14");

        public static PhysicalKeyboardKey f15 =
            new PhysicalKeyboardKey(0x0007006a, debugName: foundation_.kReleaseMode ? null : "F15");

        public static PhysicalKeyboardKey f16 =
            new PhysicalKeyboardKey(0x0007006b, debugName: foundation_.kReleaseMode ? null : "F16");

        public static PhysicalKeyboardKey f17 =
            new PhysicalKeyboardKey(0x0007006c, debugName: foundation_.kReleaseMode ? null : "F17");

        public static PhysicalKeyboardKey f18 =
            new PhysicalKeyboardKey(0x0007006d, debugName: foundation_.kReleaseMode ? null : "F18");

        public static PhysicalKeyboardKey f19 =
            new PhysicalKeyboardKey(0x0007006e, debugName: foundation_.kReleaseMode ? null : "F19");

        public static PhysicalKeyboardKey f20 =
            new PhysicalKeyboardKey(0x0007006f, debugName: foundation_.kReleaseMode ? null : "F20");

        public static PhysicalKeyboardKey f21 =
            new PhysicalKeyboardKey(0x00070070, debugName: foundation_.kReleaseMode ? null : "F21");

        public static PhysicalKeyboardKey f22 =
            new PhysicalKeyboardKey(0x00070071, debugName: foundation_.kReleaseMode ? null : "F22");

        public static PhysicalKeyboardKey f23 =
            new PhysicalKeyboardKey(0x00070072, debugName: foundation_.kReleaseMode ? null : "F23");

        public static PhysicalKeyboardKey f24 =
            new PhysicalKeyboardKey(0x00070073, debugName: foundation_.kReleaseMode ? null : "F24");

        public static PhysicalKeyboardKey open =
            new PhysicalKeyboardKey(0x00070074, debugName: foundation_.kReleaseMode ? null : "Open");

        public static PhysicalKeyboardKey help =
            new PhysicalKeyboardKey(0x00070075, debugName: foundation_.kReleaseMode ? null : "Help");

        public static PhysicalKeyboardKey select =
            new PhysicalKeyboardKey(0x00070077, debugName: foundation_.kReleaseMode ? null : "Select");

        public static PhysicalKeyboardKey again =
            new PhysicalKeyboardKey(0x00070079, debugName: foundation_.kReleaseMode ? null : "Again");

        public static PhysicalKeyboardKey undo =
            new PhysicalKeyboardKey(0x0007007a, debugName: foundation_.kReleaseMode ? null : "Undo");

        public static PhysicalKeyboardKey cut =
            new PhysicalKeyboardKey(0x0007007b, debugName: foundation_.kReleaseMode ? null : "Cut");

        public static PhysicalKeyboardKey copy =
            new PhysicalKeyboardKey(0x0007007c, debugName: foundation_.kReleaseMode ? null : "Copy");

        public static PhysicalKeyboardKey paste =
            new PhysicalKeyboardKey(0x0007007d, debugName: foundation_.kReleaseMode ? null : "Paste");

        public static PhysicalKeyboardKey find =
            new PhysicalKeyboardKey(0x0007007e, debugName: foundation_.kReleaseMode ? null : "Find");

        public static PhysicalKeyboardKey audioVolumeMute = new PhysicalKeyboardKey(0x0007007f,
            debugName: foundation_.kReleaseMode ? null : "Audio Volume Mute");

        public static PhysicalKeyboardKey audioVolumeUp = new PhysicalKeyboardKey(0x00070080,
            debugName: foundation_.kReleaseMode ? null : "Audio Volume Up");

        public static PhysicalKeyboardKey audioVolumeDown = new PhysicalKeyboardKey(0x00070081,
            debugName: foundation_.kReleaseMode ? null : "Audio Volume Down");

        public static PhysicalKeyboardKey numpadComma =
            new PhysicalKeyboardKey(0x00070085, debugName: foundation_.kReleaseMode ? null : "Numpad Comma");

        public static PhysicalKeyboardKey intlRo =
            new PhysicalKeyboardKey(0x00070087, debugName: foundation_.kReleaseMode ? null : "Intl Ro");

        public static PhysicalKeyboardKey kanaMode =
            new PhysicalKeyboardKey(0x00070088, debugName: foundation_.kReleaseMode ? null : "Kana Mode");

        public static PhysicalKeyboardKey intlYen =
            new PhysicalKeyboardKey(0x00070089, debugName: foundation_.kReleaseMode ? null : "Intl Yen");

        public static PhysicalKeyboardKey convert =
            new PhysicalKeyboardKey(0x0007008a, debugName: foundation_.kReleaseMode ? null : "Convert");

        public static PhysicalKeyboardKey nonConvert =
            new PhysicalKeyboardKey(0x0007008b, debugName: foundation_.kReleaseMode ? null : "Non Convert");

        public static PhysicalKeyboardKey lang1 =
            new PhysicalKeyboardKey(0x00070090, debugName: foundation_.kReleaseMode ? null : "Lang 1");

        public static PhysicalKeyboardKey lang2 =
            new PhysicalKeyboardKey(0x00070091, debugName: foundation_.kReleaseMode ? null : "Lang 2");

        public static PhysicalKeyboardKey lang3 =
            new PhysicalKeyboardKey(0x00070092, debugName: foundation_.kReleaseMode ? null : "Lang 3");

        public static PhysicalKeyboardKey lang4 =
            new PhysicalKeyboardKey(0x00070093, debugName: foundation_.kReleaseMode ? null : "Lang 4");

        public static PhysicalKeyboardKey lang5 =
            new PhysicalKeyboardKey(0x00070094, debugName: foundation_.kReleaseMode ? null : "Lang 5");

        public static PhysicalKeyboardKey abort =
            new PhysicalKeyboardKey(0x0007009b, debugName: foundation_.kReleaseMode ? null : "Abort");

        public static PhysicalKeyboardKey props =
            new PhysicalKeyboardKey(0x000700a3, debugName: foundation_.kReleaseMode ? null : "Props");

        public static PhysicalKeyboardKey numpadParenLeft = new PhysicalKeyboardKey(0x000700b6,
            debugName: foundation_.kReleaseMode ? null : "Numpad Paren Left");

        public static PhysicalKeyboardKey numpadParenRight = new PhysicalKeyboardKey(0x000700b7,
            debugName: foundation_.kReleaseMode ? null : "Numpad Paren Right");

        public static PhysicalKeyboardKey numpadBackspace = new PhysicalKeyboardKey(0x000700bb,
            debugName: foundation_.kReleaseMode ? null : "Numpad Backspace");

        public static PhysicalKeyboardKey numpadMemoryStore = new PhysicalKeyboardKey(0x000700d0,
            debugName: foundation_.kReleaseMode ? null : "Numpad Memory Store");

        public static PhysicalKeyboardKey numpadMemoryRecall = new PhysicalKeyboardKey(0x000700d1,
            debugName: foundation_.kReleaseMode ? null : "Numpad Memory Recall");

        public static PhysicalKeyboardKey numpadMemoryClear = new PhysicalKeyboardKey(0x000700d2,
            debugName: foundation_.kReleaseMode ? null : "Numpad Memory Clear");

        public static PhysicalKeyboardKey numpadMemoryAdd = new PhysicalKeyboardKey(0x000700d3,
            debugName: foundation_.kReleaseMode ? null : "Numpad Memory Add");

        public static PhysicalKeyboardKey numpadMemorySubtract = new PhysicalKeyboardKey(0x000700d4,
            debugName: foundation_.kReleaseMode ? null : "Numpad Memory Subtract");

        public static PhysicalKeyboardKey numpadSignChange = new PhysicalKeyboardKey(0x000700d7,
            debugName: foundation_.kReleaseMode ? null : "Numpad Sign Change");

        public static PhysicalKeyboardKey numpadClear =
            new PhysicalKeyboardKey(0x000700d8, debugName: foundation_.kReleaseMode ? null : "Numpad Clear");

        public static PhysicalKeyboardKey numpadClearEntry = new PhysicalKeyboardKey(0x000700d9,
            debugName: foundation_.kReleaseMode ? null : "Numpad Clear Entry");

        public static PhysicalKeyboardKey controlLeft =
            new PhysicalKeyboardKey(0x000700e0, debugName: foundation_.kReleaseMode ? null : "Control Left");

        public static PhysicalKeyboardKey shiftLeft =
            new PhysicalKeyboardKey(0x000700e1, debugName: foundation_.kReleaseMode ? null : "Shift Left");

        public static PhysicalKeyboardKey altLeft =
            new PhysicalKeyboardKey(0x000700e2, debugName: foundation_.kReleaseMode ? null : "Alt Left");

        public static PhysicalKeyboardKey metaLeft =
            new PhysicalKeyboardKey(0x000700e3, debugName: foundation_.kReleaseMode ? null : "Meta Left");

        public static PhysicalKeyboardKey controlRight =
            new PhysicalKeyboardKey(0x000700e4, debugName: foundation_.kReleaseMode ? null : "Control Right");

        public static PhysicalKeyboardKey shiftRight =
            new PhysicalKeyboardKey(0x000700e5, debugName: foundation_.kReleaseMode ? null : "Shift Right");

        public static PhysicalKeyboardKey altRight =
            new PhysicalKeyboardKey(0x000700e6, debugName: foundation_.kReleaseMode ? null : "Alt Right");

        public static PhysicalKeyboardKey metaRight =
            new PhysicalKeyboardKey(0x000700e7, debugName: foundation_.kReleaseMode ? null : "Meta Right");

        public static PhysicalKeyboardKey info =
            new PhysicalKeyboardKey(0x000c0060, debugName: foundation_.kReleaseMode ? null : "Info");

        public static PhysicalKeyboardKey closedCaptionToggle = new PhysicalKeyboardKey(0x000c0061,
            debugName: foundation_.kReleaseMode ? null : "Closed Caption Toggle");

        public static PhysicalKeyboardKey brightnessUp =
            new PhysicalKeyboardKey(0x000c006f, debugName: foundation_.kReleaseMode ? null : "Brightness Up");

        public static PhysicalKeyboardKey brightnessDown = new PhysicalKeyboardKey(0x000c0070,
            debugName: foundation_.kReleaseMode ? null : "Brightness Down");

        public static PhysicalKeyboardKey brightnessToggle = new PhysicalKeyboardKey(0x000c0072,
            debugName: foundation_.kReleaseMode ? null : "Brightness Toggle");

        public static PhysicalKeyboardKey brightnessMinimum = new PhysicalKeyboardKey(0x000c0073,
            debugName: foundation_.kReleaseMode ? null : "Brightness Minimum");

        public static PhysicalKeyboardKey brightnessMaximum = new PhysicalKeyboardKey(0x000c0074,
            debugName: foundation_.kReleaseMode ? null : "Brightness Maximum");

        public static PhysicalKeyboardKey brightnessAuto = new PhysicalKeyboardKey(0x000c0075,
            debugName: foundation_.kReleaseMode ? null : "Brightness Auto");

        public static PhysicalKeyboardKey mediaLast =
            new PhysicalKeyboardKey(0x000c0083, debugName: foundation_.kReleaseMode ? null : "Media Last");

        public static PhysicalKeyboardKey launchPhone =
            new PhysicalKeyboardKey(0x000c008c, debugName: foundation_.kReleaseMode ? null : "Launch Phone");

        public static PhysicalKeyboardKey programGuide =
            new PhysicalKeyboardKey(0x000c008d, debugName: foundation_.kReleaseMode ? null : "Program Guide");

        public static PhysicalKeyboardKey exit =
            new PhysicalKeyboardKey(0x000c0094, debugName: foundation_.kReleaseMode ? null : "Exit");

        public static PhysicalKeyboardKey channelUp =
            new PhysicalKeyboardKey(0x000c009c, debugName: foundation_.kReleaseMode ? null : "Channel Up");

        public static PhysicalKeyboardKey channelDown =
            new PhysicalKeyboardKey(0x000c009d, debugName: foundation_.kReleaseMode ? null : "Channel Down");

        public static PhysicalKeyboardKey mediaPlay =
            new PhysicalKeyboardKey(0x000c00b0, debugName: foundation_.kReleaseMode ? null : "Media Play");

        public static PhysicalKeyboardKey mediaPause =
            new PhysicalKeyboardKey(0x000c00b1, debugName: foundation_.kReleaseMode ? null : "Media Pause");

        public static PhysicalKeyboardKey mediaRecord =
            new PhysicalKeyboardKey(0x000c00b2, debugName: foundation_.kReleaseMode ? null : "Media Record");

        public static PhysicalKeyboardKey mediaFastForward = new PhysicalKeyboardKey(0x000c00b3,
            debugName: foundation_.kReleaseMode ? null : "Media Fast Forward");

        public static PhysicalKeyboardKey mediaRewind =
            new PhysicalKeyboardKey(0x000c00b4, debugName: foundation_.kReleaseMode ? null : "Media Rewind");

        public static PhysicalKeyboardKey mediaTrackNext = new PhysicalKeyboardKey(0x000c00b5,
            debugName: foundation_.kReleaseMode ? null : "Media Track Next");

        public static PhysicalKeyboardKey mediaTrackPrevious = new PhysicalKeyboardKey(0x000c00b6,
            debugName: foundation_.kReleaseMode ? null : "Media Track Previous");

        public static PhysicalKeyboardKey mediaStop =
            new PhysicalKeyboardKey(0x000c00b7, debugName: foundation_.kReleaseMode ? null : "Media Stop");

        public static PhysicalKeyboardKey eject =
            new PhysicalKeyboardKey(0x000c00b8, debugName: foundation_.kReleaseMode ? null : "Eject");

        public static PhysicalKeyboardKey mediaPlayPause = new PhysicalKeyboardKey(0x000c00cd,
            debugName: foundation_.kReleaseMode ? null : "Media Play Pause");

        public static PhysicalKeyboardKey speechInputToggle = new PhysicalKeyboardKey(0x000c00cf,
            debugName: foundation_.kReleaseMode ? null : "Speech Input Toggle");

        public static PhysicalKeyboardKey bassBoost =
            new PhysicalKeyboardKey(0x000c00e5, debugName: foundation_.kReleaseMode ? null : "Bass Boost");

        public static PhysicalKeyboardKey mediaSelect =
            new PhysicalKeyboardKey(0x000c0183, debugName: foundation_.kReleaseMode ? null : "Media Select");

        public static PhysicalKeyboardKey launchWordProcessor = new PhysicalKeyboardKey(0x000c0184,
            debugName: foundation_.kReleaseMode ? null : "Launch Word Processor");

        public static PhysicalKeyboardKey launchSpreadsheet = new PhysicalKeyboardKey(0x000c0186,
            debugName: foundation_.kReleaseMode ? null : "Launch Spreadsheet");

        public static PhysicalKeyboardKey launchMail =
            new PhysicalKeyboardKey(0x000c018a, debugName: foundation_.kReleaseMode ? null : "Launch Mail");

        public static PhysicalKeyboardKey launchContacts = new PhysicalKeyboardKey(0x000c018d,
            debugName: foundation_.kReleaseMode ? null : "Launch Contacts");

        public static PhysicalKeyboardKey launchCalendar = new PhysicalKeyboardKey(0x000c018e,
            debugName: foundation_.kReleaseMode ? null : "Launch Calendar");

        public static PhysicalKeyboardKey launchApp2 =
            new PhysicalKeyboardKey(0x000c0192, debugName: foundation_.kReleaseMode ? null : "Launch App2");

        public static PhysicalKeyboardKey launchApp1 =
            new PhysicalKeyboardKey(0x000c0194, debugName: foundation_.kReleaseMode ? null : "Launch App1");

        public static PhysicalKeyboardKey launchInternetBrowser = new PhysicalKeyboardKey(0x000c0196,
            debugName: foundation_.kReleaseMode ? null : "Launch Internet Browser");

        public static PhysicalKeyboardKey logOff =
            new PhysicalKeyboardKey(0x000c019c, debugName: foundation_.kReleaseMode ? null : "Log Off");

        public static PhysicalKeyboardKey lockScreen =
            new PhysicalKeyboardKey(0x000c019e, debugName: foundation_.kReleaseMode ? null : "Lock Screen");

        public static PhysicalKeyboardKey launchControlPanel = new PhysicalKeyboardKey(0x000c019f,
            debugName: foundation_.kReleaseMode ? null : "Launch Control Panel");

        public static PhysicalKeyboardKey selectTask =
            new PhysicalKeyboardKey(0x000c01a2, debugName: foundation_.kReleaseMode ? null : "Select Task");

        public static PhysicalKeyboardKey launchDocuments = new PhysicalKeyboardKey(0x000c01a7,
            debugName: foundation_.kReleaseMode ? null : "Launch Documents");

        public static PhysicalKeyboardKey spellCheck =
            new PhysicalKeyboardKey(0x000c01ab, debugName: foundation_.kReleaseMode ? null : "Spell Check");

        public static PhysicalKeyboardKey launchKeyboardLayout = new PhysicalKeyboardKey(0x000c01ae,
            debugName: foundation_.kReleaseMode ? null : "Launch Keyboard Layout");

        public static PhysicalKeyboardKey launchScreenSaver = new PhysicalKeyboardKey(0x000c01b1,
            debugName: foundation_.kReleaseMode ? null : "Launch Screen Saver");

        public static PhysicalKeyboardKey launchAssistant = new PhysicalKeyboardKey(0x000c01cb,
            debugName: foundation_.kReleaseMode ? null : "Launch Assistant");

        public static PhysicalKeyboardKey launchAudioBrowser = new PhysicalKeyboardKey(0x000c01b7,
            debugName: foundation_.kReleaseMode ? null : "Launch Audio Browser");

        public static PhysicalKeyboardKey newKey =
            new PhysicalKeyboardKey(0x000c0201, debugName: foundation_.kReleaseMode ? null : "New Key");

        public static PhysicalKeyboardKey close =
            new PhysicalKeyboardKey(0x000c0203, debugName: foundation_.kReleaseMode ? null : "Close");

        public static PhysicalKeyboardKey save =
            new PhysicalKeyboardKey(0x000c0207, debugName: foundation_.kReleaseMode ? null : "Save");

        public static PhysicalKeyboardKey print =
            new PhysicalKeyboardKey(0x000c0208, debugName: foundation_.kReleaseMode ? null : "Print");

        public static PhysicalKeyboardKey browserSearch =
            new PhysicalKeyboardKey(0x000c0221, debugName: foundation_.kReleaseMode ? null : "Browser Search");

        public static PhysicalKeyboardKey browserHome =
            new PhysicalKeyboardKey(0x000c0223, debugName: foundation_.kReleaseMode ? null : "Browser Home");

        public static PhysicalKeyboardKey browserBack =
            new PhysicalKeyboardKey(0x000c0224, debugName: foundation_.kReleaseMode ? null : "Browser Back");

        public static PhysicalKeyboardKey browserForward = new PhysicalKeyboardKey(0x000c0225,
            debugName: foundation_.kReleaseMode ? null : "Browser Forward");

        public static PhysicalKeyboardKey browserStop =
            new PhysicalKeyboardKey(0x000c0226, debugName: foundation_.kReleaseMode ? null : "Browser Stop");

        public static PhysicalKeyboardKey browserRefresh = new PhysicalKeyboardKey(0x000c0227,
            debugName: foundation_.kReleaseMode ? null : "Browser Refresh");

        public static PhysicalKeyboardKey browserFavorites = new PhysicalKeyboardKey(0x000c022a,
            debugName: foundation_.kReleaseMode ? null : "Browser Favorites");

        public static PhysicalKeyboardKey zoomIn =
            new PhysicalKeyboardKey(0x000c022d, debugName: foundation_.kReleaseMode ? null : "Zoom In");

        public static PhysicalKeyboardKey zoomOut =
            new PhysicalKeyboardKey(0x000c022e, debugName: foundation_.kReleaseMode ? null : "Zoom Out");

        public static PhysicalKeyboardKey zoomToggle =
            new PhysicalKeyboardKey(0x000c0232, debugName: foundation_.kReleaseMode ? null : "Zoom Toggle");

        public static PhysicalKeyboardKey redo =
            new PhysicalKeyboardKey(0x000c0279, debugName: foundation_.kReleaseMode ? null : "Redo");

        public static PhysicalKeyboardKey mailReply =
            new PhysicalKeyboardKey(0x000c0289, debugName: foundation_.kReleaseMode ? null : "Mail Reply");

        public static PhysicalKeyboardKey mailForward =
            new PhysicalKeyboardKey(0x000c028b, debugName: foundation_.kReleaseMode ? null : "Mail Forward");

        public static PhysicalKeyboardKey mailSend =
            new PhysicalKeyboardKey(0x000c028c, debugName: foundation_.kReleaseMode ? null : "Mail Send");

        public static PhysicalKeyboardKey keyboardLayoutSelect = new PhysicalKeyboardKey(0x000c029d,
            debugName: foundation_.kReleaseMode ? null : "Keyboard Layout Select");

        public static PhysicalKeyboardKey showAllWindows = new PhysicalKeyboardKey(0x000c029f,
            debugName: foundation_.kReleaseMode ? null : "Show All Windows");

        public static PhysicalKeyboardKey gameButton1 =
            new PhysicalKeyboardKey(0x0005ff01, debugName: foundation_.kReleaseMode ? null : "Game Button 1");

        public static PhysicalKeyboardKey gameButton2 =
            new PhysicalKeyboardKey(0x0005ff02, debugName: foundation_.kReleaseMode ? null : "Game Button 2");

        public static PhysicalKeyboardKey gameButton3 =
            new PhysicalKeyboardKey(0x0005ff03, debugName: foundation_.kReleaseMode ? null : "Game Button 3");

        public static PhysicalKeyboardKey gameButton4 =
            new PhysicalKeyboardKey(0x0005ff04, debugName: foundation_.kReleaseMode ? null : "Game Button 4");

        public static PhysicalKeyboardKey gameButton5 =
            new PhysicalKeyboardKey(0x0005ff05, debugName: foundation_.kReleaseMode ? null : "Game Button 5");

        public static PhysicalKeyboardKey gameButton6 =
            new PhysicalKeyboardKey(0x0005ff06, debugName: foundation_.kReleaseMode ? null : "Game Button 6");

        public static PhysicalKeyboardKey gameButton7 =
            new PhysicalKeyboardKey(0x0005ff07, debugName: foundation_.kReleaseMode ? null : "Game Button 7");

        public static PhysicalKeyboardKey gameButton8 =
            new PhysicalKeyboardKey(0x0005ff08, debugName: foundation_.kReleaseMode ? null : "Game Button 8");

        public static PhysicalKeyboardKey gameButton9 =
            new PhysicalKeyboardKey(0x0005ff09, debugName: foundation_.kReleaseMode ? null : "Game Button 9");

        public static PhysicalKeyboardKey gameButton10 =
            new PhysicalKeyboardKey(0x0005ff0a, debugName: foundation_.kReleaseMode ? null : "Game Button 10");

        public static PhysicalKeyboardKey gameButton11 =
            new PhysicalKeyboardKey(0x0005ff0b, debugName: foundation_.kReleaseMode ? null : "Game Button 11");

        public static PhysicalKeyboardKey gameButton12 =
            new PhysicalKeyboardKey(0x0005ff0c, debugName: foundation_.kReleaseMode ? null : "Game Button 12");

        public static PhysicalKeyboardKey gameButton13 =
            new PhysicalKeyboardKey(0x0005ff0d, debugName: foundation_.kReleaseMode ? null : "Game Button 13");

        public static PhysicalKeyboardKey gameButton14 =
            new PhysicalKeyboardKey(0x0005ff0e, debugName: foundation_.kReleaseMode ? null : "Game Button 14");

        public static PhysicalKeyboardKey gameButton15 =
            new PhysicalKeyboardKey(0x0005ff0f, debugName: foundation_.kReleaseMode ? null : "Game Button 15");

        public static PhysicalKeyboardKey gameButton16 =
            new PhysicalKeyboardKey(0x0005ff10, debugName: foundation_.kReleaseMode ? null : "Game Button 16");

        public static PhysicalKeyboardKey gameButtonA =
            new PhysicalKeyboardKey(0x0005ff11, debugName: foundation_.kReleaseMode ? null : "Game Button A");

        public static PhysicalKeyboardKey gameButtonB =
            new PhysicalKeyboardKey(0x0005ff12, debugName: foundation_.kReleaseMode ? null : "Game Button B");

        public static PhysicalKeyboardKey gameButtonC =
            new PhysicalKeyboardKey(0x0005ff13, debugName: foundation_.kReleaseMode ? null : "Game Button C");

        public static PhysicalKeyboardKey gameButtonLeft1 = new PhysicalKeyboardKey(0x0005ff14,
            debugName: foundation_.kReleaseMode ? null : "Game Button Left 1");

        public static PhysicalKeyboardKey gameButtonLeft2 = new PhysicalKeyboardKey(0x0005ff15,
            debugName: foundation_.kReleaseMode ? null : "Game Button Left 2");

        public static PhysicalKeyboardKey gameButtonMode = new PhysicalKeyboardKey(0x0005ff16,
            debugName: foundation_.kReleaseMode ? null : "Game Button Mode");

        public static PhysicalKeyboardKey gameButtonRight1 = new PhysicalKeyboardKey(0x0005ff17,
            debugName: foundation_.kReleaseMode ? null : "Game Button Right 1");

        public static PhysicalKeyboardKey gameButtonRight2 = new PhysicalKeyboardKey(0x0005ff18,
            debugName: foundation_.kReleaseMode ? null : "Game Button Right 2");

        public static PhysicalKeyboardKey gameButtonSelect = new PhysicalKeyboardKey(0x0005ff19,
            debugName: foundation_.kReleaseMode ? null : "Game Button Select");

        public static PhysicalKeyboardKey gameButtonStart = new PhysicalKeyboardKey(0x0005ff1a,
            debugName: foundation_.kReleaseMode ? null : "Game Button Start");

        public static PhysicalKeyboardKey gameButtonThumbLeft = new PhysicalKeyboardKey(0x0005ff1b,
            debugName: foundation_.kReleaseMode ? null : "Game Button Thumb Left");

        public static PhysicalKeyboardKey gameButtonThumbRight = new PhysicalKeyboardKey(0x0005ff1c,
            debugName: foundation_.kReleaseMode ? null : "Game Button Thumb Right");

        public static PhysicalKeyboardKey gameButtonX =
            new PhysicalKeyboardKey(0x0005ff1d, debugName: foundation_.kReleaseMode ? null : "Game Button X");

        public static PhysicalKeyboardKey gameButtonY =
            new PhysicalKeyboardKey(0x0005ff1e, debugName: foundation_.kReleaseMode ? null : "Game Button Y");

        public static PhysicalKeyboardKey gameButtonZ =
            new PhysicalKeyboardKey(0x0005ff1f, debugName: foundation_.kReleaseMode ? null : "Game Button Z");

        public static PhysicalKeyboardKey fn =
            new PhysicalKeyboardKey(0x00000012, debugName: foundation_.kReleaseMode ? null : "Fn");


        public static readonly Dictionary<int, PhysicalKeyboardKey> _knownPhysicalKeys =
            new Dictionary<int, PhysicalKeyboardKey>() {
                {0x00000000, none},
                {0x00000010, hyper},
                {0x00000011, superKey},
                {0x00000013, fnLock},
                {0x00000014, suspend},
                {0x00000015, resume},
                {0x00000016, turbo},
                {0x00000017, privacyScreenToggle},
                {0x00010082, sleep},
                {0x00010083, wakeUp},
                {0x000100b5, displayToggleIntExt},
                {0x00070000, usbReserved},
                {0x00070001, usbErrorRollOver},
                {0x00070002, usbPostFail},
                {0x00070003, usbErrorUndefined},
                {0x00070004, keyA},
                {0x00070005, keyB},
                {0x00070006, keyC},
                {0x00070007, keyD},
                {0x00070008, keyE},
                {0x00070009, keyF},
                {0x0007000a, keyG},
                {0x0007000b, keyH},
                {0x0007000c, keyI},
                {0x0007000d, keyJ},
                {0x0007000e, keyK},
                {0x0007000f, keyL},
                {0x00070010, keyM},
                {0x00070011, keyN},
                {0x00070012, keyO},
                {0x00070013, keyP},
                {0x00070014, keyQ},
                {0x00070015, keyR},
                {0x00070016, keyS},
                {0x00070017, keyT},
                {0x00070018, keyU},
                {0x00070019, keyV},
                {0x0007001a, keyW},
                {0x0007001b, keyX},
                {0x0007001c, keyY},
                {0x0007001d, keyZ},
                {0x0007001e, digit1},
                {0x0007001f, digit2},
                {0x00070020, digit3},
                {0x00070021, digit4},
                {0x00070022, digit5},
                {0x00070023, digit6},
                {0x00070024, digit7},
                {0x00070025, digit8},
                {0x00070026, digit9},
                {0x00070027, digit0},
                {0x00070028, enter},
                {0x00070029, escape},
                {0x0007002a, backspace},
                {0x0007002b, tab},
                {0x0007002c, space},
                {0x0007002d, minus},
                {0x0007002e, equal},
                {0x0007002f, bracketLeft},
                {0x00070030, bracketRight},
                {0x00070031, backslash},
                {0x00070033, semicolon},
                {0x00070034, quote},
                {0x00070035, backquote},
                {0x00070036, comma},
                {0x00070037, period},
                {0x00070038, slash},
                {0x00070039, capsLock},
                {0x0007003a, f1},
                {0x0007003b, f2},
                {0x0007003c, f3},
                {0x0007003d, f4},
                {0x0007003e, f5},
                {0x0007003f, f6},
                {0x00070040, f7},
                {0x00070041, f8},
                {0x00070042, f9},
                {0x00070043, f10},
                {0x00070044, f11},
                {0x00070045, f12},
                {0x00070046, printScreen},
                {0x00070047, scrollLock},
                {0x00070048, pause},
                {0x00070049, insert},
                {0x0007004a, home},
                {0x0007004b, pageUp},
                {0x0007004c, delete},
                {0x0007004d, end},
                {0x0007004e, pageDown},
                {0x0007004f, arrowRight},
                {0x00070050, arrowLeft},
                {0x00070051, arrowDown},
                {0x00070052, arrowUp},
                {0x00070053, numLock},
                {0x00070054, numpadDivide},
                {0x00070055, numpadMultiply},
                {0x00070056, numpadSubtract},
                {0x00070057, numpadAdd},
                {0x00070058, numpadEnter},
                {0x00070059, numpad1},
                {0x0007005a, numpad2},
                {0x0007005b, numpad3},
                {0x0007005c, numpad4},
                {0x0007005d, numpad5},
                {0x0007005e, numpad6},
                {0x0007005f, numpad7},
                {0x00070060, numpad8},
                {0x00070061, numpad9},
                {0x00070062, numpad0},
                {0x00070063, numpadDecimal},
                {0x00070064, intlBackslash},
                {0x00070065, contextMenu},
                {0x00070066, power},
                {0x00070067, numpadEqual},
                {0x00070068, f13},
                {0x00070069, f14},
                {0x0007006a, f15},
                {0x0007006b, f16},
                {0x0007006c, f17},
                {0x0007006d, f18},
                {0x0007006e, f19},
                {0x0007006f, f20},
                {0x00070070, f21},
                {0x00070071, f22},
                {0x00070072, f23},
                {0x00070073, f24},
                {0x00070074, open},
                {0x00070075, help},
                {0x00070077, select},
                {0x00070079, again},
                {0x0007007a, undo},
                {0x0007007b, cut},
                {0x0007007c, copy},
                {0x0007007d, paste},
                {0x0007007e, find},
                {0x0007007f, audioVolumeMute},
                {0x00070080, audioVolumeUp},
                {0x00070081, audioVolumeDown},
                {0x00070085, numpadComma},
                {0x00070087, intlRo},
                {0x00070088, kanaMode},
                {0x00070089, intlYen},
                {0x0007008a, convert},
                {0x0007008b, nonConvert},
                {0x00070090, lang1},
                {0x00070091, lang2},
                {0x00070092, lang3},
                {0x00070093, lang4},
                {0x00070094, lang5},
                {0x0007009b, abort},
                {0x000700a3, props},
                {0x000700b6, numpadParenLeft},
                {0x000700b7, numpadParenRight},
                {0x000700bb, numpadBackspace},
                {0x000700d0, numpadMemoryStore},
                {0x000700d1, numpadMemoryRecall},
                {0x000700d2, numpadMemoryClear},
                {0x000700d3, numpadMemoryAdd},
                {0x000700d4, numpadMemorySubtract},
                {0x000700d7, numpadSignChange},
                {0x000700d8, numpadClear},
                {0x000700d9, numpadClearEntry},
                {0x000700e0, controlLeft},
                {0x000700e1, shiftLeft},
                {0x000700e2, altLeft},
                {0x000700e3, metaLeft},
                {0x000700e4, controlRight},
                {0x000700e5, shiftRight},
                {0x000700e6, altRight},
                {0x000700e7, metaRight},
                {0x000c0060, info},
                {0x000c0061, closedCaptionToggle},
                {0x000c006f, brightnessUp},
                {0x000c0070, brightnessDown},
                {0x000c0072, brightnessToggle},
                {0x000c0073, brightnessMinimum},
                {0x000c0074, brightnessMaximum},
                {0x000c0075, brightnessAuto},
                {0x000c0083, mediaLast},
                {0x000c008c, launchPhone},
                {0x000c008d, programGuide},
                {0x000c0094, exit},
                {0x000c009c, channelUp},
                {0x000c009d, channelDown},
                {0x000c00b0, mediaPlay},
                {0x000c00b1, mediaPause},
                {0x000c00b2, mediaRecord},
                {0x000c00b3, mediaFastForward},
                {0x000c00b4, mediaRewind},
                {0x000c00b5, mediaTrackNext},
                {0x000c00b6, mediaTrackPrevious},
                {0x000c00b7, mediaStop},
                {0x000c00b8, eject},
                {0x000c00cd, mediaPlayPause},
                {0x000c00cf, speechInputToggle},
                {0x000c00e5, bassBoost},
                {0x000c0183, mediaSelect},
                {0x000c0184, launchWordProcessor},
                {0x000c0186, launchSpreadsheet},
                {0x000c018a, launchMail},
                {0x000c018d, launchContacts},
                {0x000c018e, launchCalendar},
                {0x000c0192, launchApp2},
                {0x000c0194, launchApp1},
                {0x000c0196, launchInternetBrowser},
                {0x000c019c, logOff},
                {0x000c019e, lockScreen},
                {0x000c019f, launchControlPanel},
                {0x000c01a2, selectTask},
                {0x000c01a7, launchDocuments},
                {0x000c01ab, spellCheck},
                {0x000c01ae, launchKeyboardLayout},
                {0x000c01b1, launchScreenSaver},
                {0x000c01cb, launchAssistant},
                {0x000c01b7, launchAudioBrowser},
                {0x000c0201, newKey},
                {0x000c0203, close},
                {0x000c0207, save},
                {0x000c0208, print},
                {0x000c0221, browserSearch},
                {0x000c0223, browserHome},
                {0x000c0224, browserBack},
                {0x000c0225, browserForward},
                {0x000c0226, browserStop},
                {0x000c0227, browserRefresh},
                {0x000c022a, browserFavorites},
                {0x000c022d, zoomIn},
                {0x000c022e, zoomOut},
                {0x000c0232, zoomToggle},
                {0x000c0279, redo},
                {0x000c0289, mailReply},
                {0x000c028b, mailForward},
                {0x000c028c, mailSend},
                {0x000c029d, keyboardLayoutSelect},
                {0x000c029f, showAllWindows},
                {0x0005ff01, gameButton1},
                {0x0005ff02, gameButton2},
                {0x0005ff03, gameButton3},
                {0x0005ff04, gameButton4},
                {0x0005ff05, gameButton5},
                {0x0005ff06, gameButton6},
                {0x0005ff07, gameButton7},
                {0x0005ff08, gameButton8},
                {0x0005ff09, gameButton9},
                {0x0005ff0a, gameButton10},
                {0x0005ff0b, gameButton11},
                {0x0005ff0c, gameButton12},
                {0x0005ff0d, gameButton13},
                {0x0005ff0e, gameButton14},
                {0x0005ff0f, gameButton15},
                {0x0005ff10, gameButton16},
                {0x0005ff11, gameButtonA},
                {0x0005ff12, gameButtonB},
                {0x0005ff13, gameButtonC},
                {0x0005ff14, gameButtonLeft1},
                {0x0005ff15, gameButtonLeft2},
                {0x0005ff16, gameButtonMode},
                {0x0005ff17, gameButtonRight1},
                {0x0005ff18, gameButtonRight2},
                {0x0005ff19, gameButtonSelect},
                {0x0005ff1a, gameButtonStart},
                {0x0005ff1b, gameButtonThumbLeft},
                {0x0005ff1c, gameButtonThumbRight},
                {0x0005ff1d, gameButtonX},
                {0x0005ff1e, gameButtonY},
                {0x0005ff1f, gameButtonZ},
                {0x00000012, fn}
            };
    }
}